通过 pipenv 自定义模块搜索路径 (PYTHONPATH)

新手上路,请多包涵

我有一个 Python 项目,包括一个 Jupyter 笔记本,几个脚本在 bin 目录和 --- 目录中的模块,以及 src Pipfile :dfc-59-a 中的依赖项

myproject
├── myproject.ipynb
├── Pipfile
├── Pipfile.lock
├── bin
│   ├── bar.py
│   └── foo.py
└── src
    ├── baz.py
    └── qux.py

脚本 foo.pybar.py 使用标准shebang

 #!/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'

我尝试的一种解决方案是在 --- 下添加一个 .env myproject

 PYTHONPATH=${PYTHONPATH}:${PWD}

这要归功于 pipenv 自动加载 .env ,但是将 .env 文件检查到传统项目的 gitlide 分发 .env 存储诸如密码之类的秘密 -- 事实上,我的默认值 .gitignore 对于 Python 项目已经排除了 .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.

或者,我可以将 --- 移动到 --- bin src 下,但是 Jupyter notebook 必须将模块引用为 bin.src.baz ,这也是一个麻烦,等等。

我目前的解决方法只是添加一个符号链接:

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

这行得通,我想有透明的好处,但似乎应该有某种方法可以利用 pipenv 来解决同样的问题。

是否有一种可移植的、可分发的方式将这些模块放在搜索路径上?

原文由 David Moles 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 989
2 个回答

我不确定是否有完美的解决方案,但为了 _显式而不是隐式_( PEP 20 ),我决定在运行任何脚本之前签入需要获取的文件。这是一个额外的手动步骤,但您可以将其放入 Makefile 中。

环境sh

 export PYTHONPATH=${PYTHONPATH}:${PWD}

生成文件

bar:
    source env.sh && pipenv run python scripts/bar.py
.PHONY: migrate

该解决方案有点类似于 Go 使用其 GOPATH 所采用的方法。

我认为其他解决方案不太好:

  • pipenv 旨在解决依赖关系,我可能是错的,但我没有发现任何与 PYTHONPATH 问题相关的内容。
  • 如果您开始拥有其他脚本文件夹,链接文件夹将无法很好地扩展。

原文由 charlax 发布,翻译遵循 CC BY-SA 3.0 许可协议

(来这里找答案,结果给了一个)

我有一个类似的项目文件夹结构,所以我遇到了同样的问题。

感谢您的提示,我的解决方案是添加一个文件 .envPipfile 具有以下内容的同一级别:

 $ cat .env
PYTHONPATH=${PYTHONPATH}:src

现在,用类似的东西启动我的应用程序

$ pipenv run python -m package.subpackage.app

似乎在我的项目文件夹和它的子文件夹中工作正常。

旁注(虽然这不是一个好的/干净的做事方式):

对于你的 ModuleNotFoundError: No module named 'src' 问题……“问题”是 src (文件夹)不是一个包,为了解决你可以轻松添加(空) __init__.py src 文件夹中的文件,从而使其成为“包”;这反过来将使 import src.baz 成为可能。

(后期编辑)

Actually this adds a record <project_folder>/${PYTHONPATH} in sys.path , which is useless, so the correct content of the .env file should be only PYTHONPATH=src .

原文由 Lohmar ASHAR 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题