我正在使用旧版本的 python 2.4 在远程服务器上编写 python 脚本。在脚本中,我想发出类似curl -XPUT 'http://somerul/_search' -d file.txt
or an之类ls -ltrh
的命令,并将这些命令的输出捕获到一个变量中。对于 curl 命令,输出将是我将解析的 json 格式(请告知是否有旧的 json 解析器可供我使用)..
如何在 python 脚本中进行这些类型的系统调用并将输出捕获到变量中?
先感谢您!
我正在使用旧版本的 python 2.4 在远程服务器上编写 python 脚本。在脚本中,我想发出类似curl -XPUT 'http://somerul/_search' -d file.txt
or an之类ls -ltrh
的命令,并将这些命令的输出捕获到一个变量中。对于 curl 命令,输出将是我将解析的 json 格式(请告知是否有旧的 json 解析器可供我使用)..
如何在 python 脚本中进行这些类型的系统调用并将输出捕获到变量中?
先感谢您!
您不能直接os.system
使用os
. 正如文档* 告诉您的那样,它只是在子 shell 中执行命令。该命令的标准输出将是 shell 的标准输出,即您的标准输出,因此您无法捕获它。
这就是文档明确告诉您subprocess
改用的原因。而且,如果您阅读文档,有一个很好的部分是关于用模块替换旧函数subprocess
。其中包括您正在尝试做的第一个示例。
不幸的是,你真正想要的check_output
是 2.7+。如果你有,那就是:
out = subprocess.check_output(['ls', '-ltrh'])
获取它的最简单方法是subprocess32
从 PyPI 安装,它将从 Python 3.2 的subprocess
模块向后移植到 2.4-2.7 的所有内容。
如果你想坚持使用标准库,正如你从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
json
是在 2.6中成为 stdlib 模块的解析器。最新版本仅适用于 2.5+,但旧版本(我相信 3.0 之前的所有内容,但不要引用我的话)适用于 2.4+。
* 请注意,我链接到 2.7,因为 2.4 更难在网上找到。但是他们并没有从 2.4 和 2.7 中删除任何功能os.system
,subprocess
而且他们确实仔细记录了添加或更改了哪些新功能。
这是您在 Python 2.7 中的操作方法。我没有 2.4 解释器,所以我无法为您测试:
import subprocess
cmd = ['ls', '-ltrh']
p = subprocess.Popen(cmd, stdout = subprocess.PIPE)
result = p.stdout.read()
retval = p.wait()
请注意,要使子进程正常工作,您必须将命令作为参数列表提供。