我有一个由 Jupyter 笔记本组成的 Python 项目,bin
中的几个脚本src
中的目录和模块目录,在 Pipfile
中具有依赖关系:
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
的automatic loading of .env
,但检查 .env
将文件放入项目的 git 发行版中会与 .env
的传统用法发生冲突。存储密码等 secret ——事实上,我的默认 .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.
或者,我可以移动
src
在 bin
下,但 Jupyter 笔记本必须将模块引用为 bin.src.baz
等等,也很麻烦。我目前的解决方法是添加一个符号链接(symbolic link):
myproject
├── Pipfile
├── Pipfile.lock
├── bin
│ ├── bar.py
│ ├── foo.py
│ └── src -> ../src
└── src
├── baz.py
└── qux.py
这行得通,我想有透明的好处,但似乎应该有一些方法来利用
pipenv
解决同样的问题。是否有一种可移植的、可分发的方式将这些模块放在搜索路径上?
最佳答案
我不确定是否有完美的解决方案,但出于显式而非隐式 ( PEP 20 ) 的考虑,我决定在运行任何脚本之前检查需要获取的文件。这是一个额外的手动步骤,但您可以将其放入 Makefile 中。
环境.sh
export PYTHONPATH=${PYTHONPATH}:${PWD}
生成文件
bar:
source env.sh && pipenv run python scripts/bar.py
.PHONY: migrate
该解决方案有点类似于 Go 采用
GOPATH
的方法。 .我认为其他解决方案没有那么好:
pipenv
旨在解决依赖关系,我可能是错的,但我没有找到与 PYTHONPATH
的问题相关的任何内容. 关于python - 通过 pipenv 自定义模块搜索路径(PYTHONPATH),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49699244/