在jupyter-notebook上导入失败

时间:2016-03-07 17:30:27

标签: python ipython jupyter-notebook

注意:这是import from local directory on python2的副本。

让我先说,对不起,因为我已经通过python,ipython和jupython的导入规则阅读了,并且不能再让他们保持直接了......

环境:

ubuntu linux server with jupyterhub
jupyter home is $HOME/opt
$HOME/opt/mynotebooks                      # contains my .pynb notebooks
$HOME/opt/mynotebooks/py_lib               # contains .py files
$HOME/opt/mynotebooks/py_lib/app_config.py # myapp config/links to myapp
$HOME/opt/mynotebooks/py_lib/class1.py     # contains .py files
/opt/myapp/src/app                         # contains my app .py classes
/opt/myapp/src/app/appclass.py             # contains appclass

我的notebook1.pynb包含以下启动单元格:

import os, sys
MY_NOTEBOOK = os.path.join(os.getenv('HOME'),'opt','mynotebooks')
# add my notebook to ipython path
os.chdir(MY_NOTEBOOK)
sys.path.append(MY_NOTEBOOK) 
import py_lib.app_config
print(os.getenv('MYAPP_STORE')

上面的单元格工作正常。

接下来,加载py_lib.class1单元格来做...

from py_lib.class1 import myclass1

但上面给出了错误:"没有名为class1"。

的模块

如果我将app_config.py移动到我的笔记本目录中,它可以使用以下启动单元...(注意导入app_config在没有py_lib的情况下更改...我重启内核并在重新运行之前清除所有输出)。当我执行py_lib.class1导入时,sys.path是相同的。当app_config为1级时,为什么无法找到它?没有意义吗?

import os, sys
MY_NOTEBOOK = os.path.join(os.getenv('HOME'),'opt','mynotebooks')
# add my notebook to ipython path
os.chdir(MY_NOTEBOOK)
sys.path.append(MY_NOTEBOOK) 
import app_config
print(os.getenv('MYAPP_STORE')

(顺便说一句:如果我将笔记本保存到py并通过python运行,后一个启动会失败。)

$ HOME /选择/ mynotebooks / nb_lib / app_config.py

APP_SITE = os.path.join('/opt/myapp/src')
APP_STORE = os.path.join('/opt/myapp/store')
os.environ['APP_SITE'] = APP_SITE
os.environ['APP_STORE'] = APP_STORE
# Link to APP_SITE
os.chdir(APP_SITE)
sys.path.append(APP_SITE)  
APP_UPLOAD = os.path.join(APP_STORE,'upload')

1 个答案:

答案 0 :(得分:1)

我发现问题与import from local directory重复。

具体来说,“Python 2.5 for Ubuntu 8.10在解析器的sys.path中没有当前目录(空字符串)。”

不幸的是,我的应用程序仍然在py2上,所以我在py2上运行笔记本。我已经提供了AppNotebooks的样本。所以修复是迁移到py3。或者对于app,将config放入子包(即py_lib)。