我有一个 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.py
和 bar.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 许可协议
我不确定是否有完美的解决方案,但为了 _显式而不是隐式_( PEP 20 ),我决定在运行任何脚本之前签入需要获取的文件。这是一个额外的手动步骤,但您可以将其放入 Makefile 中。
环境sh
生成文件
该解决方案有点类似于 Go 使用其
GOPATH
所采用的方法。我认为其他解决方案不太好:
pipenv
旨在解决依赖关系,我可能是错的,但我没有发现任何与PYTHONPATH
问题相关的内容。