【问题标题】:Passing command line arguments to argv in jupyter/ipython notebook在 jupyter/ipython notebook 中将命令行参数传递给 argv
【发布时间】:2016-09-28 19:14:12
【问题描述】:

我想知道是否可以在 jupyter/ipython 笔记本中使用命令行参数填充 sys.argv(或其他结构),类似于通过 python 脚本完成的方式。

例如,如果我要运行如下 python 脚本:

python test.py False

那么sys.argv 将包含参数False。但是如果我以类似的方式运行一个 jupyter 笔记本:

jupyter notebook test.ipynb False

然后命令行参数丢失。有没有办法从笔记本本身访问这个参数?

【问题讨论】:

  • 没有。笔记本通常是从笔记本仪表板加载的,因此它们依赖命令行参数没有多大意义。如果您有兴趣将输入变量传递到笔记本中,请查看nbparameterise,它对如何执行此操作有不同的看法。

标签: python jupyter-notebook command-line-arguments papermill


【解决方案1】:

环顾四周后,我发现自定义库非常繁琐,但用几行代码解决了这个问题,我认为这很漂亮。我使用 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 可以正常工作。

【讨论】:

  • 嘿,酷!感谢您的光临。我早就转向其他项目,我确信我当时找到了一些简单的方法来解决我的问题,或者使用了你提到的繁琐库之一。但这是一个巧妙的小修复,我会将其标记为任何未来询问者的答案。
  • 在 test_args.py 中,您可能希望删除 IPYNB_FILENAME 并接收笔记本的文件名作为第一个命令行参数。这将使 test_args.py 成为适用于任何需要参数的笔记本的通用脚本。否则,您需要为每个笔记本添加一个额外的脚本。
【解决方案2】:

我发现有两个项目可以满足您的要求

  • Papermill,将在您的笔记本中添加一个单元格,其中包含您在命令行上传递给它的参数。所以这很简单,你在第一个单元格中定义你的默认值(应该有parameters 标签)
  • nbparameterise 这是一个类似的概念,但你不要用默认值标记你的单元格,它必须是第一个。

这里有一个很好的资源来讨论这个问题:https://github.com/jupyter/help/issues/218

【讨论】:

  • 造纸厂看起来很棒。感谢您提供更新信息。
  • 感谢Papermill的分享,网上找了好久才找到这个库!
  • papermill 很棒,实际上解决了我需要运行带参数的 jupyter notebook 的问题。我推荐这个博客快速入门:towardsdatascience.com/introduction-to-papermill-2c61f66bea30
【解决方案3】:

我认为这个 Gist 可以帮助你:https://gist.github.com/gbishop/acf40b86a9bca2d571fa

这是一个简单的参数解析器的尝试,主要用于键=值对,可以在命令行和 IPython 笔记本中使用。它支持笔记本 URL 中的查询参数和笔记本的运行命令。

【讨论】:

  • 欢迎提供指向解决方案的链接,但您的答案必须是独立且有用的,即使有链接:请引用或总结您所在页面的相关信息'重新链接到,以防该页面不可用。
【解决方案4】:

如果目标是运行带有从命令行传递的可配置参数的笔记本,我认为最简单的方法是使用环境变量,如下所示:

NB_ARGS=some_args jupyter nbconvert --execute --to html --template full some_notebook.ipynb

然后在笔记本中,您可以import os 和使用os.environ['NB_ARGS']。变量值可以是一些包含键值对或 json 的文本。

【讨论】:

  • 请注意,设置环境变量的语法在 Windows 上会有所不同。在批处理文件中,您可以在下一行使用set NB_ARGS=some_args,后跟jupyter 命令。
  • 这是迄今为止向 Jupyter Notebook 传递参数最简单、最干净的方法
【解决方案5】:

在 Jupyter 单元格的顶部,输入如下一行:

%%python - --option1 value1 --option2 value2 --etc

在你的例子中:

%%python - True

这将像在命令行中一样使用提供的参数运行您的脚本。

例子:

%%python - --option1 value1 --option2 value2 --etc

import sys

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

将输出:

['-', '--option1', 'value1', '--option2', 'value2', '--etc']

希望对你有帮助。

【讨论】:

    【解决方案6】:

    使用args = parser.parse_args(args=[]) 会起作用。

    或者为了测试,你可以将其声明为类格式。

    class Args:
      data = './data/penn'
      model = 'LSTM'
      emsize = 200
      nhid = 200
    
    args=Args()
    

    【讨论】:

      【解决方案7】:

      sys.argv 产生一个list,所以我使用了

      sys.argv.append('hello')
      

      在一个 jupyter 笔记本中,它允许我附加额外的成员并假装我正在从命令行传递参数。

      【讨论】:

        【解决方案8】:

        一种解决方法是让 jupyter notebook 从文件中读取参数。 在命令行中,修改文件并运行 notebook。

        【讨论】:

          【解决方案9】:

          我假设您只想解析一些笔记本的参数,但没有必要使用命令行。

          如果你想解析类似的命令。

          python script.py --a A --b B
          

          您可以在笔记本中使用以下代码:

          cmd = '--a A --b B'
          args = args = parser.parse_args(cmd)
          

          对于parse_args,您可以找到更多信息here

          【讨论】:

            【解决方案10】:

            一个简单而幼稚的解决方案是将以下 sn-p 放在程序的第一行:

            import sys
            sys.argv = "your expected command line arguments here".split()
            

            执行此命令后,argparse 之类的包就可以正常运行了。

            因此,您可以在 jupyter 实验室服务器中运行您的脚本,而无需打开终端并输入您的参数。

            【讨论】:

              【解决方案11】:

              我尝试了上面列出的答案,并想出了一个不同的解决方案。

              我原来的代码是

              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()
              

              但进一步的代码 sn-ps 产生了错误。

              于是我在vars(ap.parse_args())之后打印了args,发现是字典。

              所以只需为原始参数创建一个字典:

              args={"image":  'photo.jpg', "yolo":  'yolo-coco', "confidence": 0.5,"threshold": 0.3}
              

              【讨论】:

                猜你喜欢
                • 2014-05-03
                • 1970-01-01
                • 1970-01-01
                • 2016-05-31
                • 1970-01-01
                • 1970-01-01
                • 2015-06-09
                • 2017-10-22
                相关资源
                最近更新 更多