2016-07-07 12 views
6

Mam wszystkie moje pliki .py wewnątrz skryptu folderu i wszystkich moich notesów IPython w folderze o nazwie Notebook.Ustawianie domyślnego sys.path dla IPython Notebook

Istnieje wiele zależności krzyżowych dla każdego pliku notatnika na jednym lub więcej plików w skrypcie.

Posiadanie sys.path.append na szczycie każdego notebooka wydaje się uciążliwe i mam nadzieję, że istnieje sposób dodania domyślnej ścieżki wyszukiwania, tak jak dodajemy PYTHONPATH do .bash_profile.

Teraz wykonaj następujące czynności:

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

pragnę mieć ustawienie gdzie mogę wykonać poniżej:

import DeriveFinalResultSet as drs 
+0

nie znam odpowiedzi tutaj, ale być może można je dodać do pliku dostosowywania: https://ipython.org /ipython-doc/2/config/intro.html#setting-configurable-options – mgilson

+0

Alternatywnie możesz stworzyć prosty skrypt bash z ustawieniem PYTHONPATH przed wywołaniem 'ipython' na podanym skrypcie ... – mgilson

+0

@mgilson: Zaktualizowałem. bash_profile i wskazał PYTHONPATH, aby wskazał katalog, który chciałem. I odpalam "jupiter-notebook" z konsoli i to chyba działa. Właśnie zamieszczam odpowiedź poniżej. Jeśli możesz, możesz sprawdzić, czy to prawda? –

Odpowiedz

7

Aby uniknąć „ukryte konfiguracje” (czyli rzeczy, które nie są w kontroli źródła/maszyna-specyficzne) i utrzymania separacji notebook/code jak opisać, zrobić coś jak poniżej:

code/ 
    mymodule.py 
    mypackage/ 
     __init__.py 

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

w 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') 

Następnie w mynb*.ipynb mogę szczęśliwie zrobić:

import paths 
import mymodule, mypackage 

itp

Ta ostatnia postać skutecznie zastępuje ścieżkę importu z pustymi łańcucha (katalog bieżących) na „kod” katalogu, który może być nieco czystsze. To sprawia, że ​​import jest niewrażliwy na używanie rzeczy takich jak os.chdir().

+0

Świetna odpowiedź. Może 'pathlib.Path(). Resolve(). Parent' jako pomniejsze udoskonalenie? – aparkerlue

0

Po niektórych badań zdałem sobie sprawę zmieniającym PYTHONPATH w .bash_profile powinno załatwić sprawę .

Oto dwie linie, które dodałem do mojego .bash_profile

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

Aby sprawdzić, zrobiłem następujące po otwarciu nowego ipython notebooka.

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

To powinno zadziałać. Możesz uprościć go do 1 linii: 'export PYTHONPATH =" ...: $ {PYTHONPATH} "' – mgilson

+0

@mgilson: Dziękuję za głosowanie! Dobry dzień! –

+2

Prawdopodobnie 'bash_profile' - nie jest najlepszym miejscem dla takiej konfiguracji. Jeśli masz dwa lub więcej projektów, to podejście doda zbyt wiele dodatkowych ścieżek do 'PYTHONPATH' i może doprowadzić do konfliktu nazw. – maxkoryukov

2

napisałem prosty skrypt bash, który aktualizuje ścieżkę i uruchamia 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 
Powiązane problemy