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

2024-05-28 19:44:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Python项目,它由一个Jupyter笔记本、一个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'

我尝试的一个解决方案是在myproject下添加一个.env文件:

PYTHONPATH=${PYTHONPATH}:${PWD}

这要归功于pipenvautomatic loading of ^{},但将.env文件检查到项目的git发行版中,将与传统的.env存储密码等机密的方法相冲突——事实上,我对Python项目的默认.gitignore已经排除了.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等,这也是一个麻烦。

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

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

这是可行的,而且我认为这样做的好处是透明,但似乎应该有办法利用pipenv来解决同样的问题。

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


Tags: 模块项目方法pysrcenv脚本bin
2条回答

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

环境sh

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

生成文件

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

这个解决方案有点类似于Go使用其GOPATH的方法。

我认为其他的解决方案并没有那么好:

  • pipenv旨在解决依赖关系,我可能是错的,但我没有找到任何与PYTHONPATH问题相关的东西。
  • 如果开始使用其他脚本文件夹,则链接文件夹的缩放效果不会很好。

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

我有一个类似的项目文件夹结构,所以我有同样的问题。
感谢您的提示,我的解决方案是添加一个与Pipfile相同级别的文件.env,其中包含以下内容:

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

现在,启动我的应用程序

$ pipenv run python -m package.subpackage.app

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

旁注(虽然不是一种好的/干净的做事方式):
对于你的ModuleNotFoundError: No module named 'src'问题。。。“问题”在于src(文件夹)不是一个包,为了解决这个问题,您可以很容易地在src文件夹中添加一个(空的)__init__.py文件,从而使其成为“包”;这反过来又使import src.baz成为可能。

(稍后编辑)
实际上这会在sys.path中添加一个记录<project_folder>/${PYTHONPATH},这是无用的,因此.env文件的正确内容应该只有PYTHONPATH=src

相关问题 更多 >

    热门问题