2014-12-19 22 views
7

Tôi đang sử dụng input chức năng từ fileinput module để chấp nhận kịch bản qua pipes hoặc input file Đây là kịch bản tối thiểu:Tại sao lệnh nhập không thể tìm thấy?

finput.py

import fileinput 

with fileinput.input() as f: 
    for line in f: 
     print(line) 

Sau khi thực hiện kịch bản thực thi này, tôi chạy ls | ./finput.py và nhận được unexpected error message

./finput.py: line 1: import: command not found 
./finput.py: line 3: syntax error near unexpected token `(' 
./finput.py: line 3: `with fileinput.input() as f:' 

Sửa lỗi duy nhất tôi tìm thấy là khi tôi thêm #!/usr/bin/env/python3 trước câu lệnh nhập.

Nhưng vấn đề này dường như chỉ liên quan đến mô-đun fileinput. Kể từ khi kịch bản sau đây làm việc tốt mà không có một shebang:

fruit.py

import random 

fruits = ["mango", "ananas", "apple"] 
print(random.choice(fruits)) 

Bây giờ những gì tôi bị mất? Tại sao không thể tìm thấy lệnh import vì số shebang không phải là yêu cầu trong finput.py?

+0

Bạn cũng có thể chạy theo cách này: 'python finput.py' – anilbey

Trả lời

22

Cần phải thông báo cho hệ điều hành của bạn rằng đây là chương trình Python, nếu không, nó được hiểu là tập lệnh shell (không tìm thấy lệnh import).

Giống như bạn đã xác định, điều này được thực hiện bằng cách sử dụng một dòng công việc:

#!/usr/bin/env python3 

này chỉ cần thiết nếu bạn đang đi để chạy kịch bản của bạn như thế này: ./script.py, mà nói với OS của bạn "chạy này thực thi ". Làm như vậy yêu cầu rằng hệ điều hành của bạn xác định cách nó được cho là chạy chương trình, và nó dựa trên dòng shebang cho rằng (trong số những thứ khác).

Tuy nhiên nếu bạn chạy python script.py (mà tôi đoán bạn đã làm cho fruit.py), thì Python không hỏi hệ điều hành của bạn cho dù đó là một chương trình Python hay không, do đó, dòng shebang không quan trọng.

+1

Ngoài ra hãy nhớ rằng bạn sẽ cần phải làm cho tệp thực thi – holdenweb

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