私が始める前に私は言いたいと思います - 私は知っています。このようなDIR構造があります。
.
├── project
│ ├── A
│ │ ├── __init__.py
│ │ └── somelib.py
│ ├── B
│ ├── C
│ │ └── C
│ │ ├── foo.py
│ │ └── __init__.py
│ └── __init__.py
└── run.sh
run.sh:
python3 project/C/C/foo.py
foo.py:
from project.A.somelib import somefunc
VSコードは実際にfoo.py
でIntelliSenseを取得します - somelib
からインポートできるどのような機能/変数を指示します。しかし、run.sh
を実行すると、このエラーメッセージが表示されます。
from project.A.somelib import somefunc
ModuleNotFoundError: No module named 'project'
このディレクトリ構造を保持しながらこれを解決する方法はありますか?
project/__init__.py
を追加しましたsys.path
のfoo.py
は次のようになります。['/home/dabljues/projects/project/project/C/C', '/usr/lib/python37.Zip', '/usr/lib/python3.7', '/usr/lib/python3.7/lib-dynload', '/usr/lib/python3.7/site-packages']
sys.path
もPYTHONPATH
も変更できません。パッケージモードでpythonを実行するのが役立ちます。
1)すべてのパスに対して__init__.py
を追加します。
.
├── project
│ ├── A
│ │ ├── __init__.py
│ │ └── somelib.py
│ ├── B
│ ├── C
│ │ ├── __init__.py
│ │ └── C
│ │ ├── foo.py
│ │ └── __init__.py
│ └── __init__.py
└── run.sh
2)Foo.pyの相対パスを持つモジュールをインポートします。
from ...A.somelib import somefunc
3)パッケージモードでpythonを実行します。
python -m project.C.C.foo
わたしにはできる。
Run.shスクリプトを変更してモジュールとしてfoo
を実行します。 python3 -m proj.C.C.foo
_
私はあなたのコードを与えられたあなたのコードを再現することができません(run.sh
がスクリプトを起動するだけ)。
あなたはそれが大文字と小さいものではないのですか。循環輸入?
$ mkdir -p project/A project/C/C
$ cat > project/C/C/foo.py
print('moof!')
$ cat > project/A/somelib.py
print('beef!')
$ cat > script.py
import project.A.somelib
import project.C.C.foo
$ tree
.
├── project
│ ├── A
│ │ └── somelib.py
│ └── C
│ └── C
│ └── foo.py
└── script.py
$ python3 script.py
beef!
moof!