web-dev-qa-db-ja.com

インポートコマンドが見つからないのはなぜですか?

inputモジュールのfileinput関数を使用して、pipesまたはinput fileを介してスクリプトを受け入れます。最小のスクリプトは次のとおりです。

finput.py

import fileinput

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

このスクリプトを実行可能にした後、ls | ./finput.pyを実行し、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:'

見つかった唯一の修正は、インポートステートメントの前に#!/usr/bin/env/python3を追加することです。

しかし、この問題はfileinputモジュールのみに関連しているようです。次のスクリプトはShebangなしでうまく機能したため:

fruit.py

import random

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

今、私は何が欠けていますか? import必須 in finput.pyではないため、なぜShebangコマンドが見つからないのですか?

9
styvane

これがPythonプログラムである場合、それ以外の場合は、シェルスクリプトとして解釈される(importコマンドが見つからない)OSに伝える必要があります。

あなたが特定したように、これはシェバン行を使用して行われます:

#!/usr/bin/env python3

これは、次のようなスクリプトを実行する場合にのみ必要です:./script.pyは、OSに「この実行可能ファイルを実行する」ことを伝えます。そのためには、OSがプログラムの実行方法を特定する必要があり、そのために(特に)Shebangラインに依存しています。

ただし、python script.py(これはあなたがfruit.py)、そしてPythonは、それがPythonプログラムであるかどうかをOSに尋ねないので、Shebang行は重要ではありません。

37
Thomas Orozco