2016-05-30 10 views
13

Zastanawiam się, czy możliwe jest zapełnienie sys.argv (lub innej struktury) argumentami wiersza poleceń w notatniku jowera/ipythona, podobnie jak w skrypcie pythona .Przekazywanie argumentów wiersza poleceń do argv w notebooku jupyter/ipython

Na przykład, gdybym uruchomić skrypt Pythona następująco:

python test.py False

Następnie sys.argv będzie zawierać argument False. Ale jeśli mogę uruchomić notebooka jupyter w podobny sposób:

jupyter notebook test.ipynb False

Następnie argument linii poleceń ginie. Czy istnieje jakiś sposób uzyskania dostępu do tego argumentu z poziomu samego notesu?

+0

Nie. Notatniki są często ładowane z pulpitu nawigacyjnego notebooka, więc nie ma sensu poleganie na argumentach wiersza poleceń. Jeśli chcesz przekazać zmienne wejściowe do notatnika, spójrz na [nbparameterise] (https://github.com/takluyver/nbparameterise), który ma inne podejście do tego, jak to zrobić. –

Odpowiedz

1

Po wielu rozglądać znalazłem bardzo niewygodne, niestandardowe biblioteki, ale rozwiązano je za pomocą kilku linii kodu, które uważałem za całkiem sprytne. Użyłem nbconvert, aby zakończyć raportem html jako wyjście, które zawiera całą grafikę i przecenę z notebooka, ale akceptuje parametry wiersza poleceń tak samo jak zawsze przez minimalną warstwę pythona:

Plik python test_args.py (który przyjmuje polecenie params linii jako normalne):

import sys,os 
IPYNB_FILENAME = 'test_argv.ipynb' 
CONFIG_FILENAME = '.config_ipynb' 

def main(argv): 
    with open(CONFIG_FILENAME,'w') as f: 
     f.write(' '.join(argv)) 
    os.system('jupyter nbconvert --execute {:s} --to html'.format(IPYNB_FILENAME)) 
    return None 

if __name__ == '__main__': 
    main(sys.argv) 

notebook zawiera:

import sys,os,argparse 
from IPython.display import HTML 
CONFIG_FILE = '.config_ipynb' 
if os.path.isfile(CONFIG_FILE): 
    with open(CONFIG_FILE) as f: 
     sys.argv = f.read().split() 
else: 
    sys.argv = ['test_args.py', 'input_file', '--int_param', '12'] 

parser = argparse.ArgumentParser() 
parser.add_argument("input_file",help="Input image, directory, or npy.") 
parser.add_argument("--int_param", type=int, default=4, help="an optional integer parameter.") 
args = parser.parse_args() 
p = args.int_param 
print(args.input_file,p) 

i mogę uruchomić notebooka Pythona z argumentów analizowanych jak zwykle:

python test_args.py my_input_file --int_param 12 

Mam tendencję do wklejania bloku z wywołania argparse do wrappera Pythona, dzięki czemu błędy wiersza poleceń są przechwytywane przez skrypt Pythona i -h działa poprawnie.

+0

Hej, super! Dzięki, że wpadłeś. Już dawno przeniosłem się do innych projektów i jestem pewny, że znalazłem wtedy prosty sposób na mój problem, albo zatrudniłem jedną z nieporęcznych bibliotek, o których wspomniałeś. Ale jest to drobna poprawka i zaznaczę ją jako odpowiedź dla przyszłych kandydatów. – justadampaul

9

Myślę, że ta Istota może pomóc: https://gist.github.com/gbishop/acf40b86a9bca2d571fa

Jest próbą prostego parsera argumentu dla większości par klucz = wartość, które mogą być wykorzystywane zarówno w linii poleceń i notebooków ipython. Obsługuje parametry zapytania w adresach URL notebooka i polecenie Uruchom dla notebooków.

+0

Link do rozwiązania jest mile widziany, ale twoja odpowiedź musi być samodzielna i użyteczna nawet z linkiem: proszę * podać lub podsumować * odpowiednie informacje ze strony, do której linkujesz, na wypadek, gdyby strona stała się niedostępna. –

-2

Możesz użyć wbudowanej magicznej komendy Jupyter %run w notatniku.

Od tego link, można użyć:

%run -p [prof_opts] filename.py [args to program]

lub coś %run -i script.py False

Albo jeśli analizowania argumentów %run -i script.py --flag1 False --flag2 True

+4

To jest odpowiedź na inne pytanie. Odpowiada to na pytanie "Jak uruchomić skrypt Pythona ** z ** notebooka Jupyter". Pierwotne pytanie brzmi: "Jak uruchomić notatnik Jupyter ** jako skrypt ** z możliwością ** podania opcji wiersza poleceń **" –

Powiązane problemy