2016-05-30 14 views
13

Mi chiedo se sia possibile popolare sys.argv (o qualche altra struttura) con gli argomenti della riga di comando in un blocco appunti jupyter/ipython, simile a come è fatto attraverso uno script python .Passaggio degli argomenti della riga di comando a argv nel notebook jupyter/ipython

Per esempio, se dovessi eseguire uno script python come segue:

python test.py False

Poi sys.argv conterrebbe l'argomento False. Ma se ho eseguito un notebook jupyter in un modo simile:

jupyter notebook test.ipynb False

Poi l'argomento della riga di comando si perde. C'è un modo per accedere a questo argomento all'interno del notebook stesso?

+0

No. I quaderni sono spesso caricati dal cruscotto del notebook, quindi non avrebbe molto senso affidarsi agli argomenti della riga di comando. Se sei interessato a passare le variabili di input in un blocco note, dai un'occhiata a [nbparameterise] (https://github.com/takluyver/nbparameterise), che ha un approccio diverso su come farlo. –

risposta

1

Dopo un sacco di ricerca intorno ho molto trovato ingombranti, librerie personalizzate, ma l'ho risolto con poche righe di codice che pensavo fossero piuttosto lisce. Ho usato nbconvert per finire con un rapporto html come output che contiene tutti i grafici e markdown del notebook, ma accetta i parametri della riga di comando come sempre attraverso un wrapper python minimo:

Il file python test_args.py (che prende il comando params linea come normale):

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) 

il notebook contiene:

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) 

e posso correre il notebook pitone con argomenti analizzati come al solito:

python test_args.py my_input_file --int_param 12 

Tendo ad incollare il blocco con chiamate argparse nel wrapper python in modo che gli errori della riga di comando vengano catturati dallo script python e -h funzioni correttamente.

+0

Ehi, bello! Grazie per esserti fermato. Da molto tempo ero passato ad altri progetti e sono sicuro di aver trovato un modo semplice per aggirare il mio problema, oppure ho impiegato una delle librerie ingombranti che hai menzionato. Ma questa è una piccola soluzione ben precisa e la contrassegnerò come la risposta per eventuali futuri inquirenti. – justadampaul

9

penso che questo Gist può aiutare: https://gist.github.com/gbishop/acf40b86a9bca2d571fa

Si tratta di un tentativo di un semplice parser argomento per lo più coppie chiave = valore che possono essere utilizzati sia sulla linea di comando e nei notebook ipython. Supporta parametri di query in URL notebook e un comando Esegui per notebook.

+0

Un collegamento a una soluzione è il benvenuto, ma la risposta deve essere autonoma e utile anche con il collegamento: si prega di * citare o riepilogare * le informazioni pertinenti dalla pagina a cui si sta collegando, nel caso tale pagina non sia disponibile. –

-2

è possibile utilizzare il comando magico incorporato Jupyter %run all'interno del notebook.

Da questo link, è possibile utilizzare:

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

O qualcosa di simile %run -i script.py False

Oppure, se si sta analizzando l'argomenti %run -i script.py --flag1 False --flag2 True

+4

Questa è una risposta a un'altra domanda. Questo risponde alla domanda "Come faccio a eseguire uno script Python ** da ** un blocco appunti Jupyter". La domanda iniziale è "Come faccio a far funzionare un taccuino Jupyter ** come script ** con la possibilità di ** passare le opzioni da linea di comando **" –

Problemi correlati