我正在使用第三方程序,该程序旨在作为命令行程序运行,该程序输出以后需要在我的代码中使用的文件。我在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_a
或input_b
时,这不起作用,因为看起来!
期望一个文字字符串,可以这么说。
有没有更简洁的方法来做这个而不必改变这个程序的源代码(我已经尝试过研究它,并且编写代码使得没有简单的方法来调用它的主函数。)
在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)
我认为这个例子很清楚,你可以根据自己的需要进行调整。希望能帮助到你。
你的问题类似于:
How to execute a * .PY file from a * .IPYNB file on the Jupyter notebook?
您可以使用以下命令,这有点hacky:
%run -i 'create_files.py'
“正确”的方法是使用自动重载方法。一个例子如下:
%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
希望能帮助到你。