web-dev-qa-db-ja.com

「fibo.py」の仕様の検索中にエラーが発生しました(<class「AttributeError」>:「module」オブジェクトに属性「__path__」がありません)

次の機能を持つ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があります。これを修正する方法がわかりません。

24
Eternal Learner

Python 3スクリプトを実行するには2つの方法があります。

  1. python fibo.py:引数は.pyファイルの名前です。ドットはファイル名の一部です。
  2. python -m fibo:引数はPythonモジュール、.pyなし。名前はパッケージを示します。fibo.pyは「モジュールpyパッケージfiboにあります。」

これは、あなたのような単純なスクリプトの小さな違いです。しかし、より大きなものやより複雑なものについては、importステートメントの動作に重要な効果があります。

  1. 最初の形式では、import.pyファイルのあるディレクトリを検索します(そして標準ライブラリを含む他のさまざまな場所を検索します。 sys.path を参照してください)完全なリスト)。
  2. 2番目の形式では、importcurrentディレクトリ(およびその他のさまざまな場所)を検索します。

このため、Python 3で、スクリプトの親パッケージがインポートできない場合があるため、パッケージを含むほとんどのセットアップでは(ディレクトリ内の単なるモジュールではなく)2番目のフォームが必要です。最初のフォームの下で、物事を壊す可能性があります。

しかし、このような単純なスクリプトの場合、どちらの形式でも問題ありません。

78
Kevin

これらはpython 3スクリプトを実行する2つの異なる方法です。

python fibo.py:引数は.pyファイルの名前です。

python -m fibo:引数は、Pythonモジュール、.pyなしの名前です

1
AMIT SAMOTA

Kevinの答えに加えて、スクリプトフォルダーへのパスをPYTHONPATH環境変数に追加して、一部のOSで動作するようにする必要があります。

0
Fyodor Kutsepin