[英]In a Python 2.4 script, I would like to execute a os system call `ls -l` or `curl` for example and capture the output in a variable. How to do this?
我正在使用旧版本的python 2.4在远程服务器上编写python脚本。 在脚本中,我要发出curl -XPUT 'http://somerul/_search' -d file.txt
或ls -ltrh
之类的命令,并将这些命令的输出捕获到一个变量中。 对于curl命令,输出将是我将解析的json格式(请告知是否有旧的json解析器可供我使用)。
如何在python脚本中进行此类系统调用并将输出捕获到变量中?
先感谢您!
您不能直接使用os.system
或os
任何其他工具来执行此操作。 正如文档 *告诉您的那样,它只是在子shell中执行命令。 该命令的标准输出将是外壳程序的标准输出,即您的标准输出,因此您无法采取任何措施来捕获它。
这就是为什么文档明确告诉您使用subprocess
的原因。 而且,如果您阅读了文档,则有一个不错的部分介绍了用subprocess
模块替换旧功能 。 其中包括您要作为第一个示例尝试执行的操作。
不幸的是,您真正想要的是check_output
,不幸的是2.7+。 如果您有,那将是:
out = subprocess.check_output(['ls', '-ltrh'])
得到它最简单的方法就是安装subprocess32
一封来自PyPI,这一切反向移植在Python 3.2的subprocess
模块2.4-2.7。
如果您要坚持使用stdlib(如从2.7源中看到的那样),那么这是一个微不足道的函数,可以在2.4版中已经存在的片段之上进行编写:
def check_output(*popenargs, **kwargs):
if 'stdout' in kwargs:
raise ValueError('stdout argument not allowed, it will be overridden.')
process = Popen(stdout=PIPE, *popenargs, **kwargs)
output, unused_err = process.communicate()
retcode = process.poll()
if retcode:
cmd = kwargs.get("args")
if cmd is None:
cmd = popenargs[0]
raise CalledProcessError(retcode, cmd, output=output)
return output
或者,如果您只想执行一次,则不需要包装器:
p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
out, _ = p.communicate()
do_something_with(out)
对于有关JSON解析器的附加问题,请执行以下操作:
simplejson
是在2.6中成为stdlib json
模块的解析器。 最新版本仅适用于2.5+,而较旧的版本(我相信3.0之前的所有内容,但我都不会引用)适用于2.4+。
*请注意,我链接到2.7,因为2.4很难在线找到。 但是他们没有从os.system
或2.4到2.7的subprocess
os.system
删除任何功能,并且确实注意添加或更改了哪些新功能。
这是您在Python 2.7中的操作方法。 我没有2.4解释器,因此无法为您测试一下:
import subprocess
cmd = ['ls', '-ltrh']
p = subprocess.Popen(cmd, stdout = subprocess.PIPE)
result = p.stdout.read()
retval = p.wait()
请注意,为了使子流程正常工作,必须将命令作为参数列表给出。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.