gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 12:17:07 25 4
gpt4 key购买 nike

我有一个由 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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com