文件夹结构
work/
modules/
module.py
__init__.py
notebooks/
notebook.ipynb
问题
我想在notebook.ipynb
文件里importmodules
文件夹下module.py
里面的一个函数function()
,即:
# notebook.ipynb
from modules.module import function
会提示错误🙅
ModuleNotFoundError: No module named 'modules'
更近一步,我想直接importmodule.py
,即
# notebook.ipynb
from module import function
则会提示错误
ModuleNotFoundError: No module named 'module'
解决方案
首先要明确的一点是,虽然都是Python文件,在*.ipynb
文件里使用的Python核(iPython)有别于*.py
文件使用的Python核(Python)。
其次需要明白,这出现以上问题的根本在于,work/
和work/modules/
不在iPython的环境变量中。
环境变量在哪?
与其回答“什么是环境变量?”这个只要一搜就能有的问题,我更想聊聊在哪可以找到这个环境变量,更具体的说iPython的环境变量在哪。
# notebook.ipynb
import sys
sys.path
就能看到当前这个notebook使用中的环境变量,其中应该会包括:
- 当前
notebook.ipynb
所在文件路径 - 该notebook用的python的路径
- …
我们希望把work/
和work/modules/
加到这个sys.path
这个列表中来。
添加新路径到环境变量
- 在任何位置的终端里,输入
这会生成一个ipython profile create
ipython_config.py
文件 - 接着确认iPython所在位置
会返回其所在位置的路径,如ipython locate
/home/.ipython
- 编辑
ipython_config.py
文件
在vim /home/.ipython/profile_default/ipython_config.py
c = get_config()
下面添加一行
然后按c.InteractiveShellApp.exec_lines = [ 'import sys; sys.path+=["/work","/work/modules"]']
esc
退出编辑,:wq
保存并退出。 - 这个时候重启
notebook.py
,再输入:
就会显示刚才新添加的路径。从而在import sys sys.path
import module
的时候不会再出现ModuleNotFoundErro
的问题了。