Tiêu đề tập lệnh Python


79

Tiêu đề điển hình phải là

#!/usr/bin/env python

Nhưng tôi thấy bên dưới cũng hoạt động khi thực thi tập lệnh như $python ./my_script.py

#!/usr/bin/python
#!python

Sự khác biệt giữa 2 tiêu đề này là gì? Điều gì có thể là vấn đề cho thứ hai? Cũng xin thảo luận về trường hợp trình thông dịch python có trong PATH hay không. Cảm ơn.


3
tiêu đề đó được gọi là Shebang en.wikipedia.org/wiki/Shebang_%28Unix%29
systempuntoout

4
FYI khi bạn chạy một tập lệnh theo cách $ python ./my_script.py(chỉ định pythonrõ ràng), dòng shebang ( #!) bị bỏ qua. Nó chỉ có hiệu lực nếu bạn chạy tập lệnh dưới dạng tệp thực thi, ví dụ $ ./my_script.py.
David Z

@David Zaslavsky: +1 Bắt tốt.
Mark Byers

Câu trả lời:


103

Đầu tiên, bất cứ khi nào bạn chạy một tập lệnh bằng trình thông dịch một cách rõ ràng, như trong

$ python ./my_script.py
$ ksh ~/bin/redouble.sh
$ lua5.1 /usr/local/bin/osbf3

các #!dòng luôn luôn bỏ qua. Các #!dòng là một tính năng Unix của thực thi duy nhất kịch bản, và bạn có thể nhìn thấy nó ghi đầy đủ trên trang người đàn ông choexecve(2) . Ở đó bạn sẽ thấy rằng từ sau #!phải là tên đường dẫn của một tệp thực thi hợp lệ. Vì thế

#!/usr/bin/env python

thực thi bất cứ điều gì pythoncó trên người dùng $PATH. Biểu mẫu này có khả năng phục hồi khi trình thông dịch Python được di chuyển xung quanh, điều này làm cho nó dễ di chuyển hơn, nhưng nó cũng có nghĩa là người dùng có thể ghi đè trình thông dịch Python tiêu chuẩn bằng cách đưa thứ gì đó vào trước $PATH. Tùy thuộc vào mục tiêu của bạn, hành vi này có thể ổn hoặc không.

Kế tiếp,

#!/usr/bin/python

giải quyết trường hợp phổ biến mà trình thông dịch Python được cài đặt /usr/bin. Nếu nó được cài đặt ở một nơi khác, bạn sẽ mất. Nhưng đây là một cách tốt để đảm bảo bạn nhận được chính xác phiên bản bạn muốn hoặc không có gì khác (hành vi "dừng lại"), như trong

#!/usr/bin/python2.5

Cuối cùng,

#!python

chỉ hoạt động nếu có một pythontệp thực thi trong thư mục hiện tại khi tập lệnh được chạy. Không được khuyến khích.


28


Tôi sẽ đề xuất 3 điều trong đầu tập lệnh của bạn:

Đầu tiên, như đã nói về môi trường sử dụng:

#!/usr/bin/env python

Thứ hai, đặt mã hóa của bạn:

# -*- coding: utf-8 -*-

Thứ ba, đặt một số chuỗi doc:

"""This is a awesome
    python script!"""

Và chắc chắn tôi sẽ sử dụng " "(4 dấu cách) cho danh tính.
Tiêu đề cuối cùng sẽ giống như sau:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""This is a awesome
        python script!"""


Lời chúc tốt nhất và mã hóa hạnh phúc.


Chỉ để hỗ trợ cho nhận xét có vẻ cố chấp về dấu cách trên tab: "Dấu cách là phương pháp thụt lề ưu tiên." ( python.org/dev/peps/pep-0008/#tabs-or-spaces )
deepelement

5

Tệp thực thi Python có thể được cài đặt ở một vị trí không phải / usr / bin, nhưng envgần như luôn có mặt ở vị trí đó nên việc sử dụng /usr/bin/envdễ di động hơn.


2

Từ manpage cho env(GNU coreutils 6.10):

env - run a program in a modified environment

Về lý thuyết, bạn có thể sử dụng envđể đặt lại môi trường (xóa nhiều biến môi trường hiện có) hoặc thêm các biến môi trường bổ sung trong tiêu đề tập lệnh. Thực tế mà nói, hai phiên bản bạn đề cập là giống hệt nhau. (Mặc dù những người khác đã đề cập đến một điểm tốt: chỉ định pythonthông qua envcho phép bạn chỉ định một cách trừu tượng pythonmà không cần biết đường dẫn của nó.)


1

Có, có - python có thể không ở trong /usr/bin, nhưng ví dụ như trong /usr/local/bin(BSD).

Khi sử dụng virtualenv, nó thậm chí có thể giống như ~/projects/env/bin/python


0

Điều này /usr/bin/env pythontrở nên rất hữu ích khi các tập lệnh của bạn phụ thuộc vào cài đặt môi trường, ví dụ như sử dụng các tập lệnh dựa vào python virtualenv. Mỗi virtualenv có phiên bản nhị phân python của riêng nó, được yêu cầu để thêm các gói được cài đặt trong virtualenv vào đường dẫn python (không chạm vào PYTHONPATH env).

Khi ngày càng có nhiều người bắt đầu sử dụng virtualenv để phát triển python , bạn nên sử dụng /usr/bin/env pythontrừ khi bạn không muốn mọi người sử dụng tệp nhị phân python tùy chỉnh của họ.

Lưu ý: Bạn cũng nên hiểu rằng có những vấn đề tiềm ẩn về bảo mật (trong môi trường nhiều người dùng) khi bạn để mọi người chạy tập lệnh của mình trong môi trường tùy chỉnh của họ. Bạn có thể lấy một số ý tưởng từ đây .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.