文件树:
/path/to/project/root/
├── .git/
├── Pipfile
├── Pipfile.lock
├── __init__.py
└── package1
├── __init__.py
├── src
│ ├── __init__.py
│ ├── external_lib
│ └── packageX
│ ├── packageY
│ └── packageZ
│ ├── foo.py
│ ├── bar.py
约束:
foo.py
导入bar.py
foo.py
和bar.py
都从external_lib/packageX/packageZ
导入一些文件external_lib/packageX/packageZ
中的packageX
和packageY
在PYTHONPATH
中,以包含它们自己的内容。 foo.py
,有时要启动bar.py
。 我现在正在做什么
我正在遵循here(尽管是法语)的建议,声称这是一种很好的做法:
cd package1/src/external_lib/packageX; export PYTHONPATH=$PYTHONPATH:
pwd :
pwd /packageY; cd ../../../..
import package1.src.bar
,import package1.src.external_lib.packageX.packageZ.some_module
这给出了这样的内容:
cd /path/to/project/root/
pipenv shell
cd package1/src/external_lib/packageX; export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/packageY; cd ../../../..
python package1/src/foo.py
python package1/src/bar.py
问题
关于项目架构,Pipenv使用,导入编写等方面的最佳实践是什么,以最少的手动操作和约束(例如,之前使用export PYTHONPATH=...
命令)来平滑地管理所有导入以最Pythonic和Pipenv-ic的方式运行脚本并从根目录启动脚本?
理想情况下,我也希望Pycharm能够正确地获取所有导入而无需进一步的手动设置,以便我在Pycharm中所做的事情能够反映出终端机将发生的情况。
我看到的一种可能的解决方案是使用Pipenv的.env
文件,在其中添加export PYTHONPATH=...
,并依靠其automatic loading。但是,显然该文件is not meant for that and should not be commited。