2016-03-08 23 views

Trả lời

7

Vì những gì bạn đang chạy với python script.py là chương trình python; sau đó, nó tải và chạy tập lệnh mà bạn đã chỉ định trong tham số, đó là script.py (về cơ bản là tệp văn bản). Tệp kịch bản không cần phải là tệp thực thi vì những gì được thực hiện ở đây là trình thông dịch python (chính mã nhị phân python, rõ ràng là phải có sự cho phép x).

Với .\script.py, bạn cố gắng chạy trực tiếp tập lệnh của mình (vẫn là cùng một tệp văn bản) dưới dạng chương trình. Khi bạn làm điều đó, bạn muốn nó được phân tích cú pháp bằng trình thông dịch mà bạn đã chỉ định trong dòng đầu tiên của mã tập lệnh, "shebang", ví dụ: #!/usr/bin/env python. Nếu nó không được thiết lập với sự cho phép x, hệ điều hành không cố gắng "thực thi" tệp của bạn (mặc dù nó có thể cố gắng mở nó bằng chương trình mặc định, nếu có), vì vậy, nó sẽ không quan tâm đến shebang.

+1

Để tìm hiểu thêm về cách thức hoạt động của nó, hãy tìm kiếm unix shebangs https://en.wikipedia.org/wiki/Shebang_%28Unix%29 – xvan

4

Các tập tin bản thân nó giải thích (đọc) thay vì thực sự được thực hiện trong ví dụ đầu tiên của bạn. Ứng dụng python là những gì cần thực thi quyền.

Trong ví dụ thứ hai, bản thân tệp đang được thực thi, vì vậy cần có các quyền đó để tiếp tục.

2

Khi chúng tôi chạy một kịch bản như python script.py chúng tôi thực sự gọi thông dịch viên python mà thường nằm ở /usr/bin/python (Kết quả của which python sẽ cho bạn biết nơi chính xác).

Thông dịch viên lần lượt đọc các tập lệnh và thực thi mã của nó. Đó là thông dịch viên có quyền thực thi.

Khi tập lệnh được thực thi dưới dạng ./script.py thì tập lệnh được thực thi trực tiếp và do đó tập lệnh yêu cầu quyền thực thi. Trình thông dịch được sử dụng được chỉ định bởi dòng shebang.

Khi hạt nhân tìm thấy hai byte đầu tiên là #! thì nó sử dụng phần còn lại của dòng làm thông dịch viên và chuyển tệp làm đối số. Lưu ý rằng để thực hiện điều này, tệp cần phải có quyền thực thi. Trong trường hợp trước chúng ta đang gián tiếp làm những gì hạt nhân sẽ làm có chúng tôi thực hiện kịch bản như ./script.py

Nói tóm lại để thực hiện bởi method1 người phiên dịch cần chỉ cho phép đọc nhưng cho sau này nó cần phải thực hiện nó trực tiếp

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