2016-03-26 17 views
4

次の機能を持つfibo.pyファイルにモジュールがあります。私はとのCLIのpython3からモジュールを実行したときPython - "'fibo.py'(<class 'AttributeError'>: 'モジュール'オブジェクトに属性 '__path__'の属性がありません)のスペックを見つけるときにエラーが発生しました。

#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 

は今 -

のpython3 -m fibo.py

私はエラー

を取得します

"エラー 'fibo.py' のスペックを見つけながら(: 'モジュール' オブジェクトには属性がありません 'パスを')"

変数は、現在のディレクトリを持っていたパスを。私はこれを解決する方法がわかりません。どんな助けもありがとう。

答えて

24

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

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

これはあなたのような簡単なスクリプトの小さな区別です。しかし、より大きなまたはより複雑な何かのために、それはimport文の行動に重要な影響を持っています

  1. 最初の形式は、.pyファイルの生活は(そして含む様々な他の場所を検索するディレクトリを検索するimportが発生します標準ライブラリ;全リストはsys.pathを参照してください)。
  2. import現在のディレクトリ(およびその他のさまざまな場所)を検索します。

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

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

+0

明らかに、このようなケースでは2番目のフォームは正しくないので、エラーがどのように発生するかを見てください。 –

+1

@ TadhgMcDonald-Jensen:もっと見る。 OPはモジュール名の後に.pyを付けます。モジュール名はファイル名ではありません。 – Kevin

+1

@ケビン - ありがとう。私はモジュールの.py拡張子を追加していたので、私にとって誤解を招いていたエラーです。修正をありがとう。 –

0

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

関連する問題