私はpythonの経験がないので、私の言葉に誤りがあれば教えてください。ファイル階層が次のように配置されている場合:
project\
module_1.py
module_2.py
module_1.py
関数を定義してfunc_1()
、module_2.py:
from module_1 import func_1
def func_2():
func_1()
if __name__ == '__main__':
func_2()
そしてあなたがpython module_2.py
cmdで実行すると、func_1()
定義したものを実行します。これが通常、同じ階層ファイルをインポートする方法です。しかし、あなたが書いfrom .module_1 import func_1
たときmodule_2.py
、Pythonインタープリターは言うでしょうNo module named '__main__.module_1'; '__main__' is not a package
。したがって、これを修正するには、行った変更を保持し、両方のモジュールをパッケージに移動し、実行する呼び出し元として3番目のモジュールを作成しますmodule_2.py
。
project\
package_1\
module_1.py
module_2.py
main.py
main.py:
from package_1.module_2 import func_2
def func_3():
func_2()
if __name__ == '__main__':
func_3()
しかし、我々は追加の理由.
の前module_1
ではmodule_2.py
、我々はそれと実行をしない場合ということですmain.py
、Pythonインタプリタは言うだろうNo module named 'module_1'
、少しトリッキーだと、module_1.py
右横にありますmodule_2.py
。今、私は聞かせてfunc_1()
にmodule_1.py
何か:
def func_1():
print(__name__)
__name__
誰がfunc_1を呼び出すかを記録します。これで、実行.
前の状態が維持され、印刷されるのではなく、印刷されます。これは、呼び出し元がと同じ階層にあることを示します。つまり、それ自体と同じ階層にあることを意味します。したがって、ドットがない場合は、それ自体と同じ階層で認識されますが、は認識できますが、その「下」は認識できません。module_1
main.py
package_1.module_1
module_1
func_1()
main.py
.
module_1
module_2.py
main.py
module_1
package_1
それでは、少し複雑にしましょう。がconfig.ini
あり、モジュールが「main.py」と同じ階層でそれを読み取る関数を定義している。
project\
package_1\
module_1.py
module_2.py
config.py
config.ini
main.py
そして、やむを得ない理由から、それをmodule_2.py
で呼び出す必要があるため、上位階層からインポートする必要があります。module_2.py:
import ..config
pass
2つのドットは上位階層からのインポートを意味します(3つのドットは上位より上位にアクセスする、など)。実行するmain.py
と、インタプリタは次のように言いますValueError:attempted relative import beyond top-level package
。ここの「トップレベルのパッケージ」はmain.py
です。理由だけでconfig.py
横にあるmain.py
、彼らは同じ階層にある、config.py
「下」ではないmain.py
、またはそれはによって「有鉛」ではありませんmain.py
、それは超えているので、main.py
。これを修正するには、最も簡単な方法は次のとおりです。
project\
package_1\
module_1.py
module_2.py
config.py
config.ini
main.py
それはプロジェクトファイル階層の配置の原則と一致すると思います。異なる機能のモジュールを異なるフォルダーに配置し、一番上の呼び出し元を外側に置いておくだけで、好きなようにインポートできます。