2016-03-07 6 views
2

ПРИМЕЧАНИЕ: это дубликат import from local directory on python2.импорт не работает на jupyter-notebook

Позвольте мне сказать заранее, извините, как я прочитал через правила импорта для питона, 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 в свой блокнот для ноутбука, он использует следующую ячейку запуска ... (ПРИМЕЧАНИЕ. Import import app_config изменен без py_lib ... Я перезапускаю ядро ​​и очищаю все выходные данные перед повторным запуском). Sys.path тот же, когда я импортирую py_lib.class1. Почему он не может найти его, когда 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') 

(BTW: этот последний запуск терпит неудачу, если я сохранить ноутбук на ру и запустить с помощью питона.)

$ HOME/Opt/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') 
+0

IPython не должен иметь никакого значения, как работает импорт. Это работает, если вы запускаете обычный скрипт Python, сидящий в '~/opt/mynotebooks /'? Кроме того, в вашем описании указано, что '.../class1.py # содержит .py файлы' - означает ли это, что у вас есть каталог с именем' class1.py'? Или это просто скопировано? –

+0

Чтение ... (забыл, где), похоже, существует разница между IPython/python при импорте ... по крайней мере, я это наблюдал. TOP/py_lib - это packagfe (имеет __init__.py), а один из файлов - class1.py, содержащий класс myclass (object): .... ' – frankr6591

+0

Я сохранил ноутбук как файл .py ... и когда я пытаюсь запустить файл .py с импортом ... «import app_config не работает. Таким образом, я переместил его в py_lib и «import py_lib.app_config» работает ... но теперь ноутбук не работает? Таким образом, мой запрос ... – frankr6591

ответ

1

I нашел, что этот вопрос является дубликатом import from local directory.

В частности, «Python 2.5 для Ubuntu 8.10 не имеет текущего каталога (пустая строка) в sys.path для интерпретатора».

К сожалению, мое приложение все еще находится на py2, поэтому я запускаю блокнот на py2. Я поставил образец AppNotebooks. Поэтому исправить это, чтобы перейти на py3. Или для приложения, поместите конфиг в подпакет (т.е. py_lib).

Смежные вопросы