Jupyterノートブック、bin
ディレクトリ内のいくつかのスクリプト、およびsrc
ディレクトリ内のモジュールで構成されるPythonプロジェクトがあり、Pipfile
に依存関係があります:
myproject
├── myproject.ipynb
├── Pipfile
├── Pipfile.lock
├── bin
│ ├── bar.py
│ └── foo.py
└── src
├── baz.py
└── qux.py
スクリプトfoo.py
およびbar.py
は標準のシバンを使用します
#!/usr/bin/env python
pipenv Shell
で実行できます:
mymachine:myproject myname$ pipenv Shell
(myproject-U308romt) bash-3.2$ bin/foo.py
foo
ただし、スクリプトからsrc
のモジュールに簡単にアクセスすることはできません。私が追加した場合
import src.baz as baz
foo.py
に、私は得る:
ModuleNotFoundError: No module named 'src'
私が試した1つの解決策は、myproject
の下に.env
ファイルを追加することです。
PYTHONPATH=${PYTHONPATH}:${PWD}
これはpipenv
の .env
の自動読み込みのおかげで機能しますが、プロジェクトのgitディストリビューションに.env
ファイルをチェックすると、従来の.env
を使用してパスワードなどの秘密を保存する-実際、Pythonプロジェクトのデフォルトの.gitignore
は、この理由ですでに.env
を除外しています。
$ git add .env
The following paths are ignored by one of your .gitignore files:
.env
Use -f if you really want to add them.
または、src
をbin
の下に移動することもできますが、Jupyterノートブックはモジュールをbin.src.baz
などとして参照する必要があり、これも面倒です。
私の現在の回避策は、シンボリックリンクを追加することです。
myproject
├── Pipfile
├── Pipfile.lock
├── bin
│ ├── bar.py
│ ├── foo.py
│ └── src -> ../src
└── src
├── baz.py
└── qux.py
これは機能し、透明であるという利点があると思いますが、pipenv
を活用して同じ問題を解決する方法があるはずです。
これらのモジュールを検索パスに配置するポータブルで配布可能な方法はありますか?
これに完璧な解決策があるかどうかはわかりませんが、暗黙的ではなく明示的であるために( PEP 2 )、私は決めましたスクリプトを実行する前にソースが必要なファイルをチェックインします。これは1つの追加の手動手順ですが、たとえばMakefileにこれを置くことができます。
env.sh
export PYTHONPATH=${PYTHONPATH}:${PWD}
Makefile
bar:
source env.sh && pipenv run python scripts/bar.py
.PHONY: migrate
解決策は、GoがGOPATH
で使用するアプローチに少し似ています。
私は他の解決策はそれほど良くないと思う:
pipenv
は依存関係を解決することを目的としており、間違っている可能性がありますが、PYTHONPATH
の問題に関連するものは見つかりませんでした。(答えを求めてここに来ましたが、代わりに1つを与えました)
私は同様のプロジェクトフォルダ構造を持っているので、同じ問題がありました。
あなたのヒントのおかげで、私の解決策はファイルを追加することでした.env
は次の内容のPipfile
と同じレベルにあります。
$ cat .env
PYTHONPATH=${PYTHONPATH}:src
今、私のようなもので私のアプリを起動します
$ pipenv run python -m package.subpackage.app
私のプロジェクトのフォルダ内からもサブフォルダからでもうまくいくようです。
サイドノート(物事を行うための良い/きれいな方法ではありませんが):
あなたのための ModuleNotFoundError: No module named 'src'
問題...「問題」はsrc
(フォルダー)がパッケージではないことです。これを修正するために、簡単に(空の)__init__.py
ファイルをsrc
フォルダー内に配置し、「パッケージ」にします。これにより、import src.baz
可能。
(後の編集)
実際には、これによりレコードが追加されます<project_folder>/${PYTHONPATH}
in sys.path
、これは役に立たないので、.env
ファイルはPYTHONPATH=src
。