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.
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ć. –