【发布时间】:2020-10-23 14:04:31
【问题描述】:
我知道关于这个主题有很多问题,但没有一个对我有太大帮助。
我有一个 python 项目目录,即git_project(git 存储库)。我想要的是创建一个名为notebooks 的单独目录,我将在其中保留所有笔记本以使用 git_project 进行分析。我不想将笔记本放在 git_project 的根目录中。我将git_project 和notebooks 目录都保存在一个保存我所有项目的通用目录中。我有以下结构:
my_projects
│
├── notebooks
│ └── notebook.ipynb
└── git_project
└── config
└── cfg.json
└── source
└── config.py
config.py的内容:
import json
def get_cfg():
with open('config/cfg.json', 'r') as f:
cfg = json.load(f)
return cfg
notebook.ipynb的内容:
import sys
import os
module_path = os.path.abspath(os.path.join('..'))
if module_path not in sys.path:
sys.path.append(module_path)
from git_project.source.config import get_cfg
get_cfg()
现在,当我在 notebook.ipynb 中运行代码时,出现以下错误:
---------------------------------------------------------------------------
FileNotFoundError Traceback (most recent call last)
<ipython-input-7-6796ee7f0100> in <module>
----> 1 get_cfg()
~/Documents/my_projects/git_project/source/config.py in get_cfg()
1 def get_cfg():
----> 2 with open('config/cfg.json', 'r') as f:
3 cfg = json.load(f)
4 return cfg
FileNotFoundError: [Errno 2] No such file or directory: 'config/cfg.json'
但是,如果我将 notebook.ipynb 文件移动到 git_project 的根目录。然后我没有收到此错误。这只是一个例子。我在 git_project 的其他模块中有很多类似的问题,而 git_project 包含已经在生产环境中运行的代码。所以在这里改变 git_project 中的任何东西都是不可行的。
但正如我所说,我不想将笔记本移动到 git_project 中,而是希望将它们保存在并行目录中以进行分析。如果需要,我可以提供更多信息。
我正在使用 Python 3.6+,它甚至不需要再放入 init.py 文件来制作目录包。
我应该怎么做才能使它起作用?任何帮助将不胜感激。
【问题讨论】:
-
尝试
../git_project/config/cfg.json获取get_cfg()中的路径。但理想情况下,get_cfg(path)会采用路径变量,这样您就可以轻松地从各个位置调用它,而无需编辑函数本身。 -
确保您的
git_project在根目录中有__init__.py文件 -
即使使用相对路径的方法有效,但通常最好使用更明确的方式 - 例如
environment variable与您的项目根目录,在这种情况下,您的笔记本真正独立于项目并且可以尽可能多地使用。只需以您喜欢的任何方式(stackoverflow.com/questions/37890898/…)设置MY_PROJECT_ROOT环境变量,然后使用getenv('MY_PROJECT_ROOT')而不是os.path.join('..') -
@Ahmet:但是如果我改变路径,它不会依赖于笔记本目录位置吗?
-
@EugeneK:我不明白你的意思是如何使用 Jupyter notebook 中的环境变量?可以举个例子吗?