我有一个Python项目,它由一个Jupyter笔记本、一个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'
我尝试的一个解决方案是在myproject
下添加一个.env
文件:
PYTHONPATH=${PYTHONPATH}:${PWD}
这要归功于pipenv
的automatic 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
来解决同样的问题。
是否有一种可移植的、可分发的方法将这些模块放到搜索路径上?
我不确定是否有完美的解决方案,但是为了显式而不是隐式,我决定在运行任何脚本之前签入一个需要源代码的文件。这是一个额外的手动步骤,但您可以将其放入Makefile中。
环境sh
生成文件
这个解决方案有点类似于Go使用其
GOPATH
的方法。我认为其他的解决方案并没有那么好:
pipenv
旨在解决依赖关系,我可能是错的,但我没有找到任何与PYTHONPATH
问题相关的东西。(来找答案,结果却给了一个)
我有一个类似的项目文件夹结构,所以我有同样的问题。
感谢您的提示,我的解决方案是添加一个与
Pipfile
相同级别的文件.env
,其中包含以下内容:现在,启动我的应用程序
从我的项目文件夹和子文件夹中似乎工作正常。
旁注(虽然不是一种好的/干净的做事方式):
对于你的
ModuleNotFoundError: No module named 'src'
问题。。。“问题”在于src
(文件夹)不是一个包,为了解决这个问题,您可以很容易地在src
文件夹中添加一个(空的)__init__.py
文件,从而使其成为“包”;这反过来又使import src.baz
成为可能。(稍后编辑)
实际上这会在
sys.path
中添加一个记录<project_folder>/${PYTHONPATH}
,这是无用的,因此.env
文件的正确内容应该只有PYTHONPATH=src
。相关问题 更多 >
编程相关推荐