web-dev-qa-db-ja.com

Pythonモジュールなし)X - 絶対インポートという名前のモジュール

私が始める前に私は言いたいと思います - 私は知っています。このような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.pathfoo.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.pathPYTHONPATHも変更できません。
  • 私は何かをインストールすることはできません
  • Sudo-accessがありません
  • スクリプトがダウンロード可能で迅速に実行可能であることを想定しているため、VirtualEnvを作成できません。
6
dabljues

パッケージモードで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

わたしにはできる。

2
openxxs

Run.shスクリプトを変更してモジュールとしてfooを実行します。 python3 -m proj.C.C.foo _

0
user1302884

私はあなたのコードを与えられたあなたのコードを再現することができません(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!
0
AKX