如何使用Jupyter单元调用python命令行程序

时间:2018-12-20 00:36:55

标签: python python-3.x command-line jupyter-notebook

我正在使用一个第三方程序,该程序旨在作为命令行程序运行,该程序输出我以后需要在代码中使用的文件。我正在Jupyter Lab工作,并且想要将函数调用集成到我的代码中。典型的运行方式是:

python create_files.py -a input_a -b input_b -c -d

然后我想在我的Jupyter笔记本中称呼它。我已经可以通过使用!来使它正常工作,即:

! python create_files.py -a input_a -b input_b -c -d

这个问题是,当我想使用变量指定input_ainput_b时,这是行不通的,因为似乎!期望使用文字字符串,可以这么说

有没有一种更干净的方法可以执行此操作而不必更改该程序的源代码(我已经尝试了一下,并且编写了代码,因此没有简单的方法可以调用其主要功能。)< / p>

2 个答案:

答案 0 :(得分:1)

在Jupyter笔记本上,使用subprocess运行命令行脚本的过程如下:

简单的命令行版本:

 dir *.txt /s /b

在Jupyter笔记本上:

import subprocess
sp = subprocess.Popen(['dir', '*.txt', '/s', '/b'], \
    stderr=subprocess.PIPE, \
    stdout=subprocess.PIPE, \
    shell=True)

(std_out, std_err) = sp.communicate()   # returns (stdout, stderr)

打印出错误消息,以防万一:

print('std_err: ', std_err)

打印出回显消息:

print('std_out: ', std_out)

我认为这个例子很清楚,您可以根据需要进行调整。希望能帮助到你。

答案 1 :(得分:0)

您的问题类似于以下问题:

How to execute a * .PY file from a * .IPYNB file on the Jupyter notebook?

您可以使用以下命令,此命令有点hacky:

%run -i 'create_files.py'

一种“正确”的方法是使用 autoreload 方法。一个例子如下:

%load_ext autoreload
%autoreload 2
from create_files import some_function
output=some_function(input)

自动重载的参考如下: https://ipython.org/ipython-doc/3/config/extensions/autoreload.html

希望有帮助。