2016-07-07 6 views
6

У меня есть все мои .py-файлы внутри сценария папки и все мои IPython-ноутбуки под папкой с именем Notebook.Установка по умолчанию sys.path для IPython Notebook

Существует несколько кросс-зависимостей для каждого файла ноутбука на одном или нескольких файлах сценария.

Имея sys.path.append в верхней части каждого ноутбука кажется громоздким, и я надеюсь, что есть способ добавить путь поиска по умолчанию, как мы добавляем PYTHONPATH в .bash_profile.

Теперь я следующее:

import sys 
sys.path.append("<path where DeriveFinalResultSet.py exists>) 
import DeriveFinalResultSet as drs 

Я хочу, чтобы условия, в которых я могу сделать ниже:

import DeriveFinalResultSet as drs 
+0

Я не знаю ответа здесь, но, возможно, вы могли бы добавить его в файл настройки: https://ipython.org /ipython-doc/2/config/intro.html#setting-configurable-options – mgilson

+0

В качестве альтернативы вы можете создать простой скрипт bash с наборами PYTHONPATH перед вызовом 'ipython' в данном скрипте ... – mgilson

+0

@mgilson: Я обновил. bash_profile и указал PYTHONPATH, чтобы указать на каталог, который я хотел. И я запускаю «юпитер-ноутбук» с консоли, и, похоже, это трюк. Я просто отправляю ответ ниже. Если бы вы могли, можете ли вы проверить, правильно ли это? –

ответ

7

Чтобы избежать «скрытых настроек» (то есть вещи, которые не в состоянии контролировать источник/машинно-специфический) и поддерживать разделение ноутбука/код, как вы описали, я что-то вроде ниже:

code/ 
    mymodule.py 
    mypackage/ 
     __init__.py 

notebooks/ 
    mynb.ipynb 
    mynb2.ipynb 
    paths.py <--- below 

в paths.py:

import sys 
import pathlib 
sys.path.insert(0, str(pathlib.Path(__file__).parents[1]/'code')) 
# sys.path[0] = str(pathlib.Path(__file__).parents[1]/'code') 

Тогда в mynb*.ipynb я могу счастливо сделать:

import paths 
import mymodule, mypackage 

и т.д.

Последняя форма эффективно заменяет путь импорта из пустых строки (текущий каталог) в «код» каталог, который, возможно, немного чище. Это делает импорт нечувствительным к использованию таких вещей, как os.chdir().

+0

Отличный ответ. Может быть, 'pathlib.Path(). Resolve(). Parent' как второстепенное уточнение? – aparkerlue

0

После некоторых исследований я понял меняющегося PYTHONPATH в .bash_profile должны сделать трюк ,

Вот две строки, которые я добавил к моему .bash_profile

PYTHONPATH="<path where DeriveFinalResultSet.py exists>:$PYTHONPATH" 
export PYTHONPATH 

Чтобы проверить, я сделал следующее после открытия свежего IPython ноутбука.

import sys 
print(sys.path) 
['', '**<path where DeriveFinalResultSet.py exists>**', '<some path>Google Drive/Project/AnimalPhotoBias/Notebooks', '<some path>anaconda/lib/python35.zip', '<some path>anaconda/lib/python3.5', '<some path>anaconda/lib/python3.5/plat-darwin', '<some path>anaconda/lib/python3.5/lib-dynload', '<some path>anaconda/lib/python3.5/site-packages/Sphinx-1.3.5-py3.5.egg', '<some path>anaconda/lib/python3.5/site-packages/setuptools-20.3-py3.5.egg', '<some path>anaconda/lib/python3.5/site-packages', '<some path>anaconda/lib/python3.5/site-packages/aeosa', '<some path>anaconda/lib/python3.5/site-packages/IPython/extensions', '<some path>.ipython'] 
+1

Это должно сработать. Вы можете упростить его до 1 строки: 'export PYTHONPATH =" ...: $ {PYTHONPATH} "' – mgilson

+0

@mgilson: Спасибо за голосование! Добрый день! –

+2

Возможно, 'bash_profile' - это не лучшее место для такой конфигурации. Если у вас есть два или более проектов, этот подход добавит слишком много дополнительных путей к 'PYTHONPATH' и может привести к конфликту имен. – maxkoryukov

2

Я написал простой скрипт Баш, который обновляет путь и запускает Jupyter:

#!/usr/bin/env bash 

echo "Saving PYTHONPATH" 
ORIGINAL_PYTHONPATH=$PYTHONPATH 
echo "Prepending package to PYTHONPATH" 
export PYTHONPATH="$PWD/:$ORIGINAL_PYTHONPATH" 
echo "Starting Jupyter" 
jupyter notebook 
echo "Reverting to the original PYTHONPATH" 
export PYTHONPATH=$ORIGINAL_PYTHONPATH 
Смежные вопросы