「project」というフォルダーに Python コードがあるため、コード ファイルは project/*.py にあります。その中にサブモジュールが必要です。
project/code.py # where code lives
project/mymodule1 # where more code lives
project/mymodule2
各モジュールディレクトリには、独自のinit .py ファイルがあります。
project/mymodule1/__init__.py
mymodule1 (project/mymodule1/test.py) 内にファイル「test.py」があり、「コード」から何かを参照したいとします。たとえば、関数「myfunc」をインポートします。
== project/mymodule1/test.py ==
from code import myfunc
問題は、ユーザーが「project/」ディレクトリを PYTHONPATH に配置しない限り、「コード」が見つからないことです。これを回避し、ある種の「相対パス」を使用して myfunc をインポートする方法はありますか?
from ../code import myfunc
基本的に、スクリプト内からプログラムで変更できない限り、コードのユーザーに PYTHONPATH の変更を強制したくありません。私はそれが箱から出して動作することを望みます。
これはどのように行うことができますか?どちらの解決策も良いです: プログラムで PYTHONPATH を変更するか、より理想的には、ある種の相対インポートを使用して「コード」を参照します。それは「myfunc」に関連しています。
編集:誰かがパッケージ内インポートの適切な例を示してもらえますか? 「mymodule1」からやってみました:
from .. import foo
「foo」はcode.pyにありますが、機能しません。mymodule1 に init .py があるので、次のようにします。
project/code.py
project/mymodule1/__init__.py
project/mymodule1/module1_code.py
ここで、module1_code.py は、「code.py」で定義された関数である foo をインポートしようとします。
編集:私がまだ抱えている主な混乱は、プロジェクト/サブ1/テスト階層を示す私のメッセージに応答して与えられた例を採用した後でも、サブ1に「cd」して「python test.py」を実行してそれを実行できないことです。仕事。ユーザーは「project」を含むディレクトリにいて、「import project.sub1.test」を実行する必要があります。ユーザーがどのディレクトリにいるかに関係なく、これが機能することを望みます。この場合、ユーザーは project/sub1/ にあるファイル「test.py」を実行する必要があります。したがって、テストケースは次のとおりです。
$ cd project/sub1
$ python test.py
エラーが発生します:
ValueError: Attempted relative import in non-package
これはどのように修正できますか?
ありがとう。