在 Jupyter,我自己的小模块没有加载,但是在 python/bpython 中一切正常
import sys print(sys.path)
我的模块的路径在 Jupyter 不会显示,但在 python/bpython 中仍然存在。
我使用:
最相似的问题是这个 无法导入 Jupyter 笔记本中的模块; 错误的 sys.path
如何配置木星自动加载我的模块?
这是我在木星笔记本上做的项目,
import sys sys.path.append("../") # go to parent dir from customFunctions import *
然后,为了影响 customFunctions.py的变化,
customFunctions.py
%load_ext autoreload %autoreload 2
木星有它自己的 PATH 变量,JUPYTER _ PATH。
将这一行添加到 .bashrc文件对我来说很有效:
.bashrc
export JUPYTER_PATH=<directory_for_your_module>:$JUPYTER_PATH
Jupiter 是基于 ipython 的,一个永久的解决方案可能是更改 ipython 配置选项。
创建配置文件
$ ipython profile create $ ipython locate /Users/username/.ipython
编辑配置文件
$ cd /Users/username/.ipython $ vi profile_default/ipython_config.py
下面几行允许您将模块路径添加到 sys.path
c.InteractiveShellApp.exec_lines = [ 'import sys; sys.path.append("/path/to/your/module")' ]
在 jupyter 启动时,将执行前一行
这里您可以找到更多关于 ipython 配置 https://www.lucypark.kr/blog/2013/02/10/when-python-imports-and-ipython-does-not/的详细信息
假设您的项目具有以下结构,并且您希望在 notebook.ipynb中执行导入操作:
notebook.ipynb
/app /mypackage mymodule.py /notebooks notebook.ipynb
如果你在一个没有任何 viralenv 的 docker 容器中运行 Jupiter,它可能对 在项目文件夹中创建 Jupiter (ipython)配置很有用:
/app /profile_default ipython_config.py
ipython_config.py内容:
ipython_config.py
c.InteractiveShellApp.exec_lines = [ 'import sys; sys.path.append("/app")' ]
打开笔记本,检查一下:
print(sys.path)
[”,’/usr/local/lib/python36.zip’,’/usr/local/lib/python3.6’, “/usr/local/lib/python3.6/lib-dynload”, “/usr/local/lib/python3.6/site-package”, “/usr/local/lib/python3.6/site-packages/IPython/ 件”, “/root/. ipython”,“/app”]
现在你可以在你的笔记本上进行导入,而不需要在单元格中添加任何 sys.path:
sys.path
from mypackage.mymodule import myfunc
您可以使用绝对导入:
/root /app /config newfile.py /source file.ipynb # In the file.ipynb importing the newfile.py file import os os.chdir(ROOT_PATH) from app.config import newfile
验证过的解决方案不适合我,因为我的笔记本不在 sys.path 中
import os,sys sys.path.insert(1, os.path.join(os.getcwd() , '..'))
我不喜欢 sys.path.append("../")。 这实际上将字符串 ../添加到路径,而不是绝对路径。
sys.path.append("../")
../
__file__
..
下面的方法为 sys.path 添加了绝对路径,我没有遇到任何问题:
import sys import os sys.path.insert(0, os.path.abspath('..'))
现在所有的工作方式都和普通的 python & jupyter 笔记本一样。
我们可以检查系统路径并通过以下方式进行验证:
# Testing import sys for p in sys.path: print(p)
我们仍然存在访问文件及其在模块中使用的路径的问题。这是因为像 open这样的文件 io 使用基于工作目录的路径。
open
最好的解决方案是清理我们构造文件路径的方式,使其具有来自该特定 python 模块的相对路径。
例如:
def get_transactions(): transaction_path = Path(__file__).parent.parent.parent / 'data_source/some_input.csv' print(transaction_path) transactions_df = pd.read_parquet(path=transaction_path) if os.path.isfile(transaction_path) else None return transactions_df