2017-12-03 4 views
0

サブパッケージ/ディレクトリ内のファイルから関数を呼び出す必要のあるファイルがあるプロジェクトで作業しています。同じサブパッケージ内の別のファイルから関数を呼び出しています。したがって、サブファイルをインポートするメインファイルがあります。このサブファイルは、同じパッケージ内にある別のサブファイルもインポートしています。同じパッケージから別のファイルをインポートしているパッケージからファイルをインポートする方法

最初のサブファイルは、2番目のサブファイルをインポートする際に何も問題はありません。メインファイルには、最初のサブファイルをインポートする際の問題もありません。しかし、すべてをまとめてメインファイルを実行すると、Pythonは2番目のサブファイルが存在しないと思います。これは奇妙なものです。私は単純化され、以下の例で私の問題を可視化しました:

I以下のファイル階層があります。

test_package\ 
    __init__.py 
    main_file.py 
    test_sub_package\ 
     __init__.py 
     subfile1.py 
     subfile2.py 

main_fileコード:

import test_sub_package.subfile1 

subfile1コード:

import subfile2 

サブファイル2コード:

def get_string(): 
    return ("Hello, World!") 

したがって、mainfileがsubfile1を介してsubfile2をインポートすると思います。しかし、これは私がエラーを取得するため、場合ではないようです。

Traceback (most recent call last): 
    File "...\Test\main_file.py", line 1, in <module> 
    import test_package.subfile1 
    File "...\Test\test_sub_package\subfile1.py", line 1, in <module> 
    import subfile2 
ModuleNotFoundError: No module named 'subfile2' 

私は、私もsubfile2で機能を呼び出すしようとする前に、私はこのエラーを得たことを少し驚きました。いずれにせよ、私はなぜこれがうまくいかないのか混乱しています。私はちょうどここで愚かなことをやっているのですか、何かをしようとすると、基本的にPythonはサポートしていません。誰かが私に解決策を与えることができれば、それは最も高く評価されるだろう。

これはおそらく重複していると思われますが、私の特定の問題に対する回答が見つかりませんでした。だから、事前に申し訳ありません。

+0

は、 –

+1

がためにあなたと題し、質問への回答を見て[相対輸入品をお持ちの輸入test_sub_package.subfile2' 'へのインポートを変更してみてください)from . import test_sub_package.subfile1へ10億回](https://stackoverflow.com/questions/14132789/relative-imports-for-the-billionth-time)? – martineau

+1

@martineauどのように私はこれを逃したのか分かりません。私は、私が探していた重要な用語を知らなかったと思う:P。とにかくこれは素晴らしいリンクです、ありがとう。 – daydreamingwill

答えて

2

同じディレクトリから別のモジュールにモジュールをインポートすると、あなたがsubfile1.pyで相対インポートを使用する必要があります使用する必要があります。

from . import subfile2 

サブファイル1にはへのアクセス権が与えられていないことに注意してください。 210はsubfile1でそれを使用するために、あなたはsubfile2.get_string()を書いたり、直接それをインポートするか必要があります:

from .subfile2 import get_string 

が、私はこれを試してみましたが、それは動作しますが、私はこのことができます:)

注意を願っ:それを、 Pythonスクリプトを実行していて、同じディレクトリにモジュールをインポートする必要がある場合は、import module_nameと言うことができます。実行しているスクリプトであれば、または他のスクリプトで使用されているモジュールであれば違いがあります。理由についての詳細な説明については、here

(私はメインを実行するというエラーメッセージから推測します。そうでない場合PY、あなたは変更する必要がありますimport test_sub_package.subfile1あなたsubfile1で

+0

私は参照してください。それはたくさんのことをクリアします。ありがとう:) – daydreamingwill

1

メインファイルは次のようになります。

from test_sub_package.subfile1 import get_string 
get_string() 

subfile1.py

import test_sub_package.subfile2 
+0

この解決法は私のために働いたが、ティムの答えはそれをよりきれいにするように思えた。それでも、あなたの助けは非常に高く評価されています:) – daydreamingwill

関連する問題