此必须已被询问过,但我一生都找不到。
我有一个类似这样的项目结构
ROOT
├── README.md
├── modules
│ ├── __init__.py
│ ├── mod1.py
│ └── mod2.py
├── tests
│ ├── test_mod1.py
│ └── test_mod2.py
├── notebooks
│ ├── nb1.ipynb
│ ├── nb2.ipynb
│ └── sub_dir
│ ├── sub_nb.ipynb
│ ├── generate_py
│ └── py_files
│ └── sub_nb.py
├── definitions
└── main.py
因此,我可以从main.py
导入definitions
中的任何内容,也可以导入ROOT/modules
中的任何模块。
我想要的是能够从notebooks
目录树中的任何位置从这些文件中导入。我知道我可以使用以下方法做到这一点:
import sys
sys.path.append("..")
但是notebooks
目录树有很多层,我不希望我的代码看起来像这样:
import sys
sys.path.append("../../../../")
此外,文件generate_py
是bash脚本,它将jupyter笔记本(.ipynb
)转换为.py
文件,并将.py
文件存储到{{ 1}}子目录。
使用上述方法,我最终不得不手动编辑每个文件,以将额外的./py_files
放入../
中。这很烦人。
如果我从pycharm中运行文件,则一切正常(我猜想它会在创建sys.append()
时更新您的PYTHONPATH以包括项目根目录吗?)
更复杂的是,该项目在多台通过git共享的机器上运行。所以绝对参考了。
但是从终端运行,或者从jupyter内部运行,它无法查找模块或定义,而无需经过main.py
进程。而且我觉得必须有更好的方法。
那这里的最佳实践是什么?