2017-06-11 6 views
2

私はimport.pyのスクリプトを持っています。私はm1.py、言って、別のファイルにいくつかのコードを抽出したい:Pythonスクリプトを相対インポートを使用して複数のファイルに分割する方法は?

$ ls 
import.py m1.py 

$ cat import.py 
from .m1 import a 
a() 

$ cat m1.py 
def a(): 
    print('it works') 

$ python import.py 
Traceback (most recent call last): 
    File "import.py", line 1, in <module> 
    from .m1 import a 
ModuleNotFoundError: No module named '__main__.m1'; '__main__' is not a package 

私は絶対輸入に切り替え、それが動作します。しかし、私は間違って他のモジュールをインポートしたくない。私はスクリプトのディレクトリからモジュールがインポートされていることを確認したい。私はそれをどのように機能させるのですか?または私は何を間違っているのですか?

答えて

1

組み込みのモジュールを上書きしない場合は、デフォルトでは、pythonは最初に現在のディレクトリで、インポートするファイル名を探します。したがって、別のディレクトリに同じ名前の別のスクリプトがある場合、現在のディレクトリにあるスクリプトだけがインポートされます。

次に、絶対インポートを使用してインポートできます。

from m1 import a 
a() 

あなたはpythonでインポートの詳細infrotmationため、thisポストをチェックアウトすることができます。

インポートするものが組み込まれていないことを確認するには、現在のディレクトリ、たとえば "my_package"で独自のパッケージを作成し、モジュールm1をその中に移動させます。次に、あなたがして、インポートすることができます:

from my_package import m1 
m1.a() 
+0

[doc](https://docs.python.org/3/tutorial/modules.html#the-module-search-path)には、「spamという名前のモジュールをインポートすると、インタープリタは最初にその名前のモジュールを見つけます。見つからなければ、変数[sys.path](https://docs.python.org/3/library/)で指定されたディレクトリのリストでspam.pyという名前のファイルを検索します。 sys.html#sys.path)。 "だから私はモジュールのスクリプトのディレクトリからの組み込みモジュールをオーバーライドすることはできません。 –

+0

はい、あなたは書き込みです。あなたの上書きするモジュールがあなたのPATHディレクトリの1つを見つけたならば、私が上で述べたことはうまくいくでしょう。独自のパッケージを作成することで確実に確認できます。現在のディレクトリに "my_package"というフォルダを作成し、そこに "\ _ \ _ init \ _ \ _"を作成します。py 次に、my_packageフォルダにm1.pyファイルを移動します。 my_package import m1 m1.a() – omargamal8

+0

私はちょうどあなたの言葉を修正していました(回答の中のもの、組み込みモジュールに関するもの)。私はあなたの答えがもっと好きです。パッケージの作成に関しては、どのような違いがありますか? –

0

m1.pyのディレクトリに__init__.pyを追加します。
編集:以前の作業ディレクトリからパッケージとして実行します。 cd .. && python -m prev_dir.import

+1

一つおそらく相対的な輸入が[できない]であることを、ここに追加される場合があります(https://docs.python.org/3/tutorial/modules.html#intra-package-references )をメインモジュールに追加しました。 –

関連する問題