web-dev-qa-db-ja.com

pipenvによるモジュール検索パス(PYTHONPATH)のカスタマイズ

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.

または、srcbinの下に移動することもできますが、Jupyterノートブックはモジュールをbin.src.bazなどとして参照する必要があり、これも面倒です。

私の現在の回避策は、シンボリックリンクを追加することです。

myproject
├── Pipfile
├── Pipfile.lock
├── bin
│   ├── bar.py
│   ├── foo.py
│   └── src -> ../src
└── src
    ├── baz.py
    └── qux.py

これは機能し、透明であるという利点があると思いますが、pipenvを活用して同じ問題を解決する方法があるはずです。

これらのモジュールを検索パスに配置するポータブルで配布可能な方法はありますか?

17
David Moles

これに完璧な解決策があるかどうかはわかりませんが、暗黙的ではなく明示的であるために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の問題に関連するものは見つかりませんでした。
  • 他のスクリプトフォルダーを作成し始めた場合、フォルダーのリンクはあまりうまくスケールしません。
12
charlax

(答えを求めてここに来ましたが、代わりに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

1
Lohmar ASHAR