次の機能を持つfibo.py
ファイルにモジュールがあります-
#fibonacci numbers module
def fib(n): # write Fibonacci series up to n
a, b = 0, 1
while b < n:
print(b, end=' ')
a, b = b, a+b
print()
def fib2(n): # return Fibonacci series up to n
result = []
a, b = 0, 1
while b < n:
result.append(b)
a, b = b, a+b
return result
これで、cli python3からモジュールを実行すると-
> python3 -m fibo.py
エラーが表示されます
Error while finding spec for 'fibo.py' (<class 'AttributeError'>:
'module' object has no attribute '__path__')
__path__
変数には現在のdirがあります。これを修正する方法がわかりません。
Python 3スクリプトを実行するには2つの方法があります。
python fibo.py
:引数は.py
ファイルの名前です。ドットはファイル名の一部です。python -m fibo
:引数はPythonモジュール、.py
なし。名前はパッケージを示します。fibo.py
は「モジュールpy
パッケージfibo
にあります。」これは、あなたのような単純なスクリプトの小さな違いです。しかし、より大きなものやより複雑なものについては、import
ステートメントの動作に重要な効果があります。
import
が.py
ファイルのあるディレクトリを検索します(そして標準ライブラリを含む他のさまざまな場所を検索します。 sys.path
を参照してください)完全なリスト)。import
がcurrentディレクトリ(およびその他のさまざまな場所)を検索します。このため、Python 3で、スクリプトの親パッケージがインポートできない場合があるため、パッケージを含むほとんどのセットアップでは(ディレクトリ内の単なるモジュールではなく)2番目のフォームが必要です。最初のフォームの下で、物事を壊す可能性があります。
しかし、このような単純なスクリプトの場合、どちらの形式でも問題ありません。
これらはpython 3スクリプトを実行する2つの異なる方法です。
python fibo.py:引数は.pyファイルの名前です。
python -m fibo:引数は、Pythonモジュール、.pyなしの名前です
Kevinの答えに加えて、スクリプトフォルダーへのパスをPYTHONPATH環境変数に追加して、一部のOSで動作するようにする必要があります。