在 jupyter/ipython notebook 中将命令行参数传递给 argv
Passing command line arguments to argv in jupyter/ipython notebook
我想知道是否可以在 jupyter/ipython 笔记本中使用命令行参数填充 sys.argv
(或其他结构),类似于通过 python 完成的方式脚本。
例如,如果我要 运行 一个 python 脚本如下:
python test.py False
那么 sys.argv
将包含参数 False
。但是,如果我以类似的方式 运行 一个 jupyter 笔记本:
jupyter notebook test.ipynb False
然后命令行参数丢失。有什么方法可以从笔记本本身访问这个参数吗?
我认为这个 Gist 可能对您有所帮助:https://gist.github.com/gbishop/acf40b86a9bca2d571fa
这是对一个简单的参数解析器的尝试,主要用于可在命令行和 IPython 笔记本中使用的主要键=值对。它支持笔记本 URL 中的查询参数和笔记本的 运行 命令。
四处寻找后,我发现自定义库非常麻烦,但用几行我认为非常巧妙的代码解决了它。我使用 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 notebook 参数像往常一样解析:
python test_args.py my_input_file --int_param 12
我倾向于将带有 argparse 调用的块粘贴到 python 包装器中,以便 python 脚本捕获命令行错误并且 -h 正常工作。
使用 args = parser.parse_args(args=[])
可以。
或者为了测试,您可以将其声明为 class 格式。
class Args:
data = './data/penn'
model = 'LSTM'
emsize = 200
nhid = 200
args=Args()
我发现有两个项目可以满足您的要求
- Papermill 会将一个单元格添加到您的笔记本中,其中包含您在命令行上传递给它的参数。所以这很简单,您在第一个单元格中定义默认值(应该有
parameters
标签)
- nbparameterise 这是一个类似的概念,但您没有使用默认值标记您的单元格,它必须是第一个。
这里有一个讨论这个问题的好资源:https://github.com/jupyter/help/issues/218
sys.argv
产生 list
,所以我使用了
sys.argv.append('hello')
在 jupyter notebook 中,它允许我附加额外的成员并假装我正在从命令行传递参数。
解决方法是让 jupyter notebook 从文件中读取参数。
从命令行修改文件和 运行 笔记本。
如果目标是 运行 从命令行传递可配置参数的笔记本,我认为最简单的方法是使用环境变量,如下所示:
NB_ARGS=some_args jupyter nbconvert --execute --to html --template full some_notebook.ipynb
然后在笔记本中,你可以import os
并使用os.environ['NB_ARGS']
。变量值可以是一些包含 key-value 对或 json 的文本。
我假设你只是想解析笔记本的一些参数,但没有必要使用命令行。
如果你想像这样解析命令。
python script.py --a A --b B
您可以在notebook中使用以下代码:
cmd = '--a A --b B'
args = args = parser.parse_args(cmd)
对于parse_args
,您可以找到更多信息here。
在 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']
希望对您有所帮助。
一个简单而幼稚的解决方案是将以下代码片段放在程序的第一行:
import sys
sys.argv = "your expected command line arguments here".split()
执行此命令后,像argparse
这样的包就可以正常工作了。
因此,您可以在 jupyter 实验室服务器中 运行 您的脚本,而无需打开终端并输入您的参数。
我尝试了上面列出的答案,并想出了一个不同的解决方案。
我的原始代码是
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 设为
Class Args():
image='photo.jpg'
yolo='yolo-coco'
confidence=0.5
threshold=0.3
args=Args()
但是后面的代码片段产生了错误。
所以我在vars(ap.parse_args())
之后打印了args
,发现是字典
所以只需为原始参数创建一个字典:
args={"image": 'photo.jpg', "yolo": 'yolo-coco', "confidence": 0.5,"threshold": 0.3}
我想知道是否可以在 jupyter/ipython 笔记本中使用命令行参数填充 sys.argv
(或其他结构),类似于通过 python 完成的方式脚本。
例如,如果我要 运行 一个 python 脚本如下:
python test.py False
那么 sys.argv
将包含参数 False
。但是,如果我以类似的方式 运行 一个 jupyter 笔记本:
jupyter notebook test.ipynb False
然后命令行参数丢失。有什么方法可以从笔记本本身访问这个参数吗?
我认为这个 Gist 可能对您有所帮助:https://gist.github.com/gbishop/acf40b86a9bca2d571fa
这是对一个简单的参数解析器的尝试,主要用于可在命令行和 IPython 笔记本中使用的主要键=值对。它支持笔记本 URL 中的查询参数和笔记本的 运行 命令。
四处寻找后,我发现自定义库非常麻烦,但用几行我认为非常巧妙的代码解决了它。我使用 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 notebook 参数像往常一样解析:
python test_args.py my_input_file --int_param 12
我倾向于将带有 argparse 调用的块粘贴到 python 包装器中,以便 python 脚本捕获命令行错误并且 -h 正常工作。
使用 args = parser.parse_args(args=[])
可以。
或者为了测试,您可以将其声明为 class 格式。
class Args:
data = './data/penn'
model = 'LSTM'
emsize = 200
nhid = 200
args=Args()
我发现有两个项目可以满足您的要求
- Papermill 会将一个单元格添加到您的笔记本中,其中包含您在命令行上传递给它的参数。所以这很简单,您在第一个单元格中定义默认值(应该有
parameters
标签) - nbparameterise 这是一个类似的概念,但您没有使用默认值标记您的单元格,它必须是第一个。
这里有一个讨论这个问题的好资源:https://github.com/jupyter/help/issues/218
sys.argv
产生 list
,所以我使用了
sys.argv.append('hello')
在 jupyter notebook 中,它允许我附加额外的成员并假装我正在从命令行传递参数。
解决方法是让 jupyter notebook 从文件中读取参数。 从命令行修改文件和 运行 笔记本。
如果目标是 运行 从命令行传递可配置参数的笔记本,我认为最简单的方法是使用环境变量,如下所示:
NB_ARGS=some_args jupyter nbconvert --execute --to html --template full some_notebook.ipynb
然后在笔记本中,你可以import os
并使用os.environ['NB_ARGS']
。变量值可以是一些包含 key-value 对或 json 的文本。
我假设你只是想解析笔记本的一些参数,但没有必要使用命令行。
如果你想像这样解析命令。
python script.py --a A --b B
您可以在notebook中使用以下代码:
cmd = '--a A --b B'
args = args = parser.parse_args(cmd)
对于parse_args
,您可以找到更多信息here。
在 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']
希望对您有所帮助。
一个简单而幼稚的解决方案是将以下代码片段放在程序的第一行:
import sys
sys.argv = "your expected command line arguments here".split()
执行此命令后,像argparse
这样的包就可以正常工作了。
因此,您可以在 jupyter 实验室服务器中 运行 您的脚本,而无需打开终端并输入您的参数。
我尝试了上面列出的答案,并想出了一个不同的解决方案。
我的原始代码是
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 设为
Class Args():
image='photo.jpg'
yolo='yolo-coco'
confidence=0.5
threshold=0.3
args=Args()
但是后面的代码片段产生了错误。
所以我在vars(ap.parse_args())
之后打印了args
,发现是字典
所以只需为原始参数创建一个字典:
args={"image": 'photo.jpg', "yolo": 'yolo-coco', "confidence": 0.5,"threshold": 0.3}