Mục đích của #! / Usr / bin / python3


160

Tôi đã nhận thấy điều này trong một vài ngôn ngữ kịch bản, nhưng trong ví dụ này, tôi đang sử dụng python. Trong nhiều hướng dẫn, họ sẽ bắt đầu với #!/usr/bin/python3dòng đầu tiên. Tôi không hiểu tại sao chúng ta có cái này.

  • Hệ điều hành không nên biết đó là tập lệnh python (rõ ràng là nó đã được cài đặt vì bạn đang tham chiếu đến nó)
  • Điều gì xảy ra nếu người dùng đang sử dụng một hệ điều hành không dựa trên unix
  • Ngôn ngữ được cài đặt trong một thư mục khác vì bất kỳ lý do gì
  • Người dùng có một phiên bản khác nhau. Đặc biệt khi đó không phải là số phiên bản đầy đủ (Giống như Python3 vs Python32)

Nếu bất cứ điều gì, tôi có thể thấy điều này phá vỡ kịch bản python vì những lý do được liệt kê ở trên.



9
Tôi đến câu hỏi này chỉ để sao chép chuỗi shebang.
omerjerk

Câu trả lời:


260

#!/usr/bin/python3là một dòng shebang .

Một dòng shebang xác định nơi trình thông dịch được đặt. Trong trường hợp này, python3thông dịch viên được đặt tại /usr/bin/python3. Một công việc dòng cũng có thể là một bash, ruby, perlphiên dịch hoặc bất kỳ ngôn ngữ kịch bản khác, ví dụ: #!/bin/bash.

Không có dòng shebang, hệ điều hành không biết đó là tập lệnh python, ngay cả khi bạn đặt cờ thực thi trên tập lệnh và chạy nó như thế nào ./script.py. Để làm cho tập lệnh chạy theo mặc định trong python3, hãy gọi nó dưới dạng python3 script.pyhoặc đặt dòng shebang.

Bạn có thể sử dụng #!/usr/bin/env python3cho tính di động trên các hệ thống khác nhau trong trường hợp chúng có trình thông dịch ngôn ngữ được cài đặt ở các vị trí khác nhau.


8
Vậy #! /usr/bin/env python3nên chọn hơn #! /usr/bin/python3?
winklerrr

3
@winklerrr Vâng, nó được sử dụng rộng rãi hơn.
MerreM

20

Đó gọi là băm. Nếu bạn chạy tập lệnh từ trình bao, nó sẽ kiểm tra dòng đầu tiên để tìm ra chương trình nào sẽ được bắt đầu để diễn giải tập lệnh.

Một hệ điều hành không dựa trên Unix sẽ sử dụng các quy tắc riêng để tìm ra cách chạy tập lệnh. Ví dụ, Windows sẽ sử dụng phần mở rộng tên tệp và #sẽ khiến dòng đầu tiên được coi là một nhận xét.

Nếu đường dẫn đến thực thi Python là sai, thì tự nhiên kịch bản sẽ thất bại. Thật dễ dàng để tạo liên kết đến thực thi thực tế từ bất kỳ vị trí nào được chỉ định theo quy ước tiêu chuẩn.


12

Dòng này giúp tìm chương trình thực thi sẽ chạy tập lệnh. Ký hiệu shebang này khá chuẩn trên hầu hết các ngôn ngữ script (ít nhất là được sử dụng trên các hệ điều hành đã trưởng thành).

Một khía cạnh quan trọng của dòng này là quy định cụ thông dịch viên sẽ được sử dụng. Ví dụ, trên nhiều bản phân phối Linux tập trung vào phát triển, việc cài đặt một số phiên bản python cùng một lúc là bình thường.

Python 2.x và Python 3 không tương thích 100%, vì vậy sự khác biệt này có thể rất quan trọng. Vì vậy #! /usr/bin/python#! /usr/bin/python3không giống nhau (và không hoàn toàn giống #! /usr/bin/env python3như được ghi chú ở nơi khác trên trang này.


6
  1. Và dòng này là như thế nào .

  2. Nó bị bỏ qua.

  3. Nó sẽ không chạy, và nên được thay đổi để trỏ đến vị trí thích hợp. Hoặc envnên được sử dụng.

  4. Nó sẽ không chạy, và có thể không chạy dưới một phiên bản khác bất kể.


3

Để làm rõ cách thức dòng shebang hoạt động cho các cửa sổ, từ tài liệu 3.7 Python :

  • Nếu dòng đầu tiên của tệp tập lệnh bắt đầu bằng #!, Thì nó được gọi là dòng shebang tinh. Linux và các hệ điều hành Unix khác có hỗ trợ riêng cho các dòng như vậy và chúng thường được sử dụng trên các hệ thống như vậy để chỉ ra cách thực thi tập lệnh.
  • Trình khởi chạy Python cho Windows cho phép các phương tiện tương tự được sử dụng với các tập lệnh Python trên Windows
  • Để cho phép các dòng shebang trong tập lệnh Python có thể di động giữa Unix và Windows, trình khởi chạy hỗ trợ một số lệnh 'ảo' để chỉ định trình thông dịch nào sẽ sử dụng. Các lệnh ảo được hỗ trợ là:
    • / usr / bin / env trăn
      • Dạng / usr / bin / env của dòng shebang có thêm một thuộc tính đặc biệt. Trước khi tìm kiếm các trình thông dịch Python đã cài đặt, biểu mẫu này sẽ tìm kiếm PATH thực thi để tìm tệp thực thi Python. Điều này tương ứng với hành vi của chương trình Unix env, thực hiện tìm kiếm PATH.
    • / usr / bin / trăn
    • / usr / local / bin / python
    • trăn

2

Trên thực tế, việc xác định loại tệp nào là một tệp rất phức tạp, vì vậy bây giờ hệ điều hành không thể biết được. Nó có thể đưa ra nhiều dự đoán dựa trên -

  • sự mở rộng
  • Nhiễm trùng tiểu
  • MIME

Nhưng dòng lệnh không bận tâm với tất cả điều đó, bởi vì nó chạy trên một lớp tương thích ngược hạn chế, từ khi điều vô nghĩa đó không có nghĩa gì cả. Nếu bạn nhấp đúp chuột vào nó một cách chắc chắn, một hệ điều hành hiện đại có thể tìm ra điều đó - nhưng nếu bạn chạy nó từ một thiết bị đầu cuối thì không, bởi vì thiết bị đầu cuối không quan tâm đến các API gõ tệp cụ thể của hệ điều hành ưa thích của bạn.

Về các điểm khác. Thật tiện lợi, nó có thể chạy tương tự

python3 path/to/your/script

Nếu con trăn của bạn không ở trong đường dẫn được chỉ định, thì nó sẽ không hoạt động, nhưng chúng tôi có xu hướng cài đặt mọi thứ để làm những thứ như công việc này, không phải theo cách khác. Nó thực sự không quan trọng nếu bạn dưới * nix, tùy thuộc vào việc bạn có nên xem xét dòng này hay không vì nó là một shellcode. Vì vậy, ví dụ bạn có thể chạy bashtrong Windows.

Bạn thực sự có thể hoàn toàn sử dụng dòng này, điều đó chỉ có nghĩa là người gọi sẽ phải chỉ định một thông dịch viên. Ngoài ra, đừng đặt thông dịch viên của bạn ở những vị trí không chuẩn và sau đó thử gọi các tập lệnh mà không cung cấp thông dịch viên.

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.