Sys.path 在 Jupyter 和 Python 不同-如何在 Jupyter 导入自己的模块?

在 Jupyter,我自己的小模块没有加载,但是在 python/bpython 中一切正常

import sys
print(sys.path)

我的模块的路径在 Jupyter 不会显示,但在 python/bpython 中仍然存在。

我使用:

  1. 在.bashrc 中包含我的模块,
  2. Virtual alenv 中的 Jupiter 和 bpython。

最相似的问题是这个 无法导入 Jupyter 笔记本中的模块; 错误的 sys.path

如何配置木星自动加载我的模块?

159785 次浏览

这是我在木星笔记本上做的项目,

import sys
sys.path.append("../") # go to parent dir
from customFunctions import *

然后,为了影响 customFunctions.py的变化,

%load_ext autoreload
%autoreload 2

木星有它自己的 PATH 变量,JUPYTER _ PATH。

将这一行添加到 .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中执行导入操作:

/app
/mypackage
mymodule.py
/notebooks
notebook.ipynb

如果你在一个没有任何 viralenv 的 docker 容器中运行 Jupiter,它可能对 在项目文件夹中创建 Jupiter (ipython)配置很有用:

/app
/profile_default
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:

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

enter image description here

验证过的解决方案不适合我,因为我的笔记本不在 sys.path 中

import os,sys
sys.path.insert(1, os.path.join(os.getcwd()  , '..'))

我不喜欢 sys.path.append("../")。 这实际上将字符串 ../添加到路径,而不是绝对路径。

  • 这会导致加载数据文件(如 csv)时的路径差异。 如果我们沿着这条路线走下去,我们需要将这些文件路径的相对路径添加为 好吧。
  • 这使得 __file__参考中有相对的 ..。如果有逻辑写周围 __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 使用基于工作目录的路径。

最好的解决方案是清理我们构造文件路径的方式,使其具有来自该特定 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