2013-05-14 32 views
7

Tôi có chữ nhật kinh điển ở đầu các tập lệnh python của tôi.Có thể bao gồm các tùy chọn dòng lệnh trong shebang python không?

#!/usr/bin/env python 

Tuy nhiên, tôi vẫn thường muốn xuất ra không có bộ đệm vào một tập tin log khi tôi chạy kịch bản của tôi, vì vậy tôi kết thúc cuộc gọi:

$ python -u myscript.py &> myscript.out & 

Tôi có thể nhúng các tùy chọn -u trong công việc như vậy ...

#!/usr/bin/env python -u 

và chỉ gọi:

$ ./myscript.py &> myscript.out & 

... để vẫn nhận được các unbuffering? Tôi nghi ngờ rằng sẽ không làm việc, và muốn kiểm tra trước khi thử. Có cái gì đó sẽ thực hiện điều này?

+0

Có, bạn nên làm như vậy. "Shebang" chỉ là một con trỏ đến ứng dụng nhị phân phụ trách kịch bản. Nếu không, bạn có thể tạo bí danh 'bí danh ppython =" python -u "' và chỉ sử dụng '#!/Usr/bin/env ppython' – Torxed

+0

Bạn có thể làm điều này. – aestrivex

+1

Torxed, bạn đã thử câu trả lời chưa? Cách tiếp cận đó không hoạt động trong OSX hoặc Linux. Nếu nó hoạt động trong hệ điều hành của bạn, xin vui lòng chia sẻ các chi tiết vì điều đó sẽ rất thú vị. Lý do nó không hoạt động trong OSX hoặc Linux (hoặc tôi tin rằng, bất kỳ hương vị nào của unix) là 'env' tìm kiếm một tệp thực thi trên đường dẫn và bí danh không nằm trên đường dẫn. Các biệt hiệu không hoạt động trên tuyến shebang theo cùng một cách và vì lý do tương tự mà các trình xây dựng không hoạt động trên tuyến shebang. Nếu hệ điều hành của bạn cho phép điều này, xin vui lòng chia sẻ! –

Trả lời

9

Bạn có thể có đối số trên dòng shebang, nhưng hầu hết các hệ điều hành đều có giới hạn rất nhỏ về số lượng đối số. POSIX chỉ yêu cầu một đối số được hỗ trợ và điều này là phổ biến, bao gồm cả Linux.

Vì bạn đang sử dụng lệnh /usr/bin/env, bạn đã sử dụng hết một đối số đó với python, do đó bạn không thể thêm đối số khác -u. Nếu bạn muốn sử dụng python -u, bạn cần phải mã cứng đường dẫn tuyệt đối đến python thay vì sử dụng /usr/bin/env, ví dụ:

#!/usr/bin/python -u 

Xem câu hỏi liên quan này: How to use multiple arguments with a shebang (i.e. #!)?

+0

Cảm ơn. Nó trông dễ dàng đủ, nhưng tôi biết có một cái bẫy. =) Có ai đó ở sâu trong ruột của các yêu cầu POSIX tôi có thể gửi email để nói về mức độ tuyệt vời của tính năng này nếu có thể hỗ trợ nhiều hơn một đối số không? – Mittenchops

+1

Có lẽ là không. Đây là cách nó luôn hoạt động và POSIX chỉ đơn giản là chuẩn hóa hành vi hiện tại.Ngay cả khi họ thay đổi POSIX, bạn sẽ phải đợi nhiều năm để thực hiện đủ để được thiết kế lại để bạn có thể sử dụng nó một cách hợp lý. – Barmar

3

Một cách cầm tay để làm điều này là để tạo ra một thực thi mà là hiện thân lựa chọn của bạn.

Ví dụ, đặt tập tin này trên con đường của bạn và đặt tên cho nó upython, và làm cho nó thực thi:

#!/usr/bin/env bash 
python -u -and -other -options "[email protected]" 

... sử dụng bất cứ tùy chọn mà bạn cần. Sau đó, tập lệnh myscript.py của bạn có thể như sau:

#!/usr/bin/env upython 
(... your normal Python code ...) 

Torxed đề xuất thực hiện điều này thông qua bí danh vỏ. Tôi sẽ rất ngạc nhiên nếu điều đó làm việc trong bất kỳ phiên bản unix nào. Nó không hoạt động trong vài bản phân phối mà tôi vừa thử nghiệm. Cách tiếp cận của tôi sẽ làm việc trong bất kỳ unix nào.

+0

ps: và cách thích hợp để vượt qua cmdline args đến một tập lệnh hoặc hàm khác bằng cách sử dụng một dấu ngoặc kép '" $ @ "' (so với '$ @'), vì không có dấu ngoặc kép, args với dấu cách sẽ bị hỏng. (Và các bit ở đây về bí danh là hoàn toàn chính xác. Nó sẽ không hoạt động.) Cuối cùng, tôi khuyên bạn không bao giờ sử dụng 'env bash', mà là sử dụng đường dẫn đến' bash' (ví dụ, '#!/Bin/bash) ') trực tiếp. Python là vấn đề, để chắc chắn. Bash, không nhiều lắm. Các vấn đề lớn hơn w/bash là trong thực tế vô tình bằng cách sử dụng sai, sau khi tinh chỉnh 'PATH' để sử dụng các công cụ khác nhau (python, thực hiện, vv). – michael

+0

@michael_n: đã đồng ý trên các trích dẫn, cập nhật –

+0

Đối với các kịch bản lệnh bao bọc như thế này, tôi thích đặt trong "exec" để trình bao bọc không còn xuất hiện trong danh sách quy trình. Tức là, "exec python -u-và -other ...." –

Các vấn đề liên quan