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

标签 python python-3.x pythonpath pipenv

我有一个由 Jupyter 笔记本组成的 Python 项目,bin 中的几个脚本src 中的目录和模块目录,在 Pipfile 中具有依赖关系:

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}

这要归功于 pipenvautomatic 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.

或者,我可以移动 srcbin 下,但 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/

    相关文章:

    python - 在 Elasticsearch 中过滤特定字段上的查询

    python - 尝试将列表添加到列表时出现 TypeError

    Python 正则表达式不提取值 - Python 3.x

    python lxml - 简单地获取/检查 HTML 元素的类

    python - Django(带 PyCharm)和 PYTHON 路径问题

    python - 在 linux 中将环境变量添加到 $PYTHONPATH 时遇到问题

    python - 嵌套/转义 f 字符串 "="(等号)表达式

    python - cerberus:验证可选字段至少出现一次

    python - 我应该用 Python 命名我的全局模块?

    python - eclipse /PyDev : Sync System PYTHONPATH runs continuously