我想知道是否可以在 jupyter/ipython 笔记本中用命令行参数填充 sys.argv(或其他结构) ,类似于通过 python 脚本完成的操作。
sys.argv
例如,如果我运行一个 python 脚本,如下所示:
python test.py False
那么 sys.argv将包含参数 False。但是如果我以类似的方式运行一个木星笔记本:
False
jupyter notebook test.ipynb False
然后命令行参数丢失。有没有办法从笔记本本身访问这个参数?
我认为这个要点可以帮助你: https://gist.github.com/gbishop/acf40b86a9bca2d571fa
这是对一个简单的参数解析器的尝试,该解析器主要针对键 = 值对,可以在命令行和 IPython 笔记本中使用。它支持笔记本 URL 中的查询参数和笔记本的 Run 命令。
经过大量的调查,我发现了非常繁琐的自定义库,但是用几行代码解决了这个问题,我认为这些代码非常漂亮。我使用 nbConvert 最终得到一个 html 报告作为输出,其中包含笔记本上的所有图形和标记,但是通过一个最小的 python 包装器接受命令行参数:
Python 文件 test _ args.py (正常使用命令行参数) :
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)
本内容包括:
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)
我可以运行 python 笔记本,像往常一样解析参数:
python test_args.py my_input_file --int_param 12
我倾向于将带有 argparse 调用的块粘贴到 python 包装器中,以便 python 脚本能够捕获命令行错误,并且-h 能够正常工作。
使用 args = parser.parse_args(args=[])就可以了。
args = parser.parse_args(args=[])
或者为了测试,您可以将它声明为类格式。
class Args: data = './data/penn' model = 'LSTM' emsize = 200 nhid = 200 args=Args()
我发现有两个项目可以满足你的要求
parameters
下面是讨论这个问题的一个很好的资源: https://github.com/jupyter/help/issues/218
sys.argv产生一个 list,所以我使用
list
sys.argv.append('hello')
在一个 jupyter 笔记本中,它允许我附加额外的成员,并假装我正在从命令行传递参数。
变通方法是让 jupyter 笔记本读取文件中的参数。 在命令行中,修改文件并运行笔记本。
如果目标是使用从命令行传递的可配置参数运行笔记本,我认为最简单的方法是使用环境变量,如下所示:
NB_ARGS=some_args jupyter nbconvert --execute --to html --template full some_notebook.ipynb
然后在笔记本中,你可以使用 import os和 os.environ['NB_ARGS']。变量 value 可以是一些包含键-值对的文本,例如 json。
import os
os.environ['NB_ARGS']
我假设您只是想解析笔记本上的一些参数,但是没有必要使用命令行。
如果要解析如下命令。
python script.py --a A --b B
你可以在笔记本中使用以下代码:
cmd = '--a A --b B' args = args = parser.parse_args(cmd)
对于 parse_args,您可以找到更多的信息 给你。
parse_args
在木星细胞的顶部,写上这样一行:
%%python - --option1 value1 --option2 value2 --etc
在你的例子中:
%%python - True
这将使用提供的 args 在命令行中运行脚本。
例如:
%%python - --option1 value1 --option2 value2 --etc import sys if __name__ == '__main__': print(sys.argv)
将输出:
['-', '--option1', 'value1', '--option2', 'value2', '--etc']
希望能有帮助。
一个简单而天真的解决方案是将下面的代码段放在程序的第一行:
import sys sys.argv = "your expected command line arguments here".split()
执行这个命令之后,像 argparse这样的包就可以正常工作了。
argparse
因此,您可以只在 jupyterlab 服务器上运行脚本,而无需打开终端并键入参数。
我尝试了上面列出的答案,想出了一个不同的解决方案。
我的原始代码是
ap = argparse.ArgumentParser() ap.add_argument("-i", "--image", required=True, help="path to input image") ap.add_argument("-y", "--yolo", required=True, help="base path to YOLO directory") ap.add_argument("-c", "--confidence", type=float, default=0.5, help="minimum probability to filter weak detections") ap.add_argument("-t", "--threshold", type=float, default=0.3, help="threshold when applying non-maxima suppression") args = vars(ap.parse_args())
我试图把一个班级作为
Class Args(): image='photo.jpg' yolo='yolo-coco' confidence=0.5 threshold=0.3 args=Args()
但是更多的代码片段会产生错误。
所以我在 vars(ap.parse_args())之后打印了 args,发现它是一本字典。
vars(ap.parse_args())
args
所以只要为原始 args 创建一个字典:
args={"image": 'photo.jpg', "yolo": 'yolo-coco', "confidence": 0.5,"threshold": 0.3}