0

我正在使用旧版本的 python 2.4 在远程服务器上编写 python 脚本。在脚本中,我想发出类似curl -XPUT 'http://somerul/_search' -d file.txtor an之类ls -ltrh的命令,并将这些命令的输出捕获到一个变量中。对于 curl 命令,输出将是我将解析的 json 格式(请告知是否有旧的 json 解析器可供我使用)..

如何在 python 脚本中进行这些类型的系统调用并将输出捕获到变量中?

先感谢您!

4

2 回答 2

1

您不能直接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 解析器的附加问题:

simplejsonjson是在 2.6中成为 stdlib 模块的解析器。最新版本仅适用于 2.5+,但旧版本(我相信 3.0 之前的所有内容,但不要引用我的话)适用于 2.4+。


* 请注意,我链接到 2.7,因为 2.4 更难在网上找到。但是他们并没有从 2.4 和 2.7 中删除任何功能os.systemsubprocess而且他们确实仔细记录了添加或更改了哪些新功能。

于 2013-10-22T01:58:46.747 回答
0

这是您在 Python 2.7 中的操作方法。我没有 2.4 解释器,所以我无法为您测试:

import subprocess
cmd = ['ls', '-ltrh']
p = subprocess.Popen(cmd, stdout = subprocess.PIPE)
result = p.stdout.read()
retval = p.wait()

请注意,要使子进程正常工作,您必须将命令作为参数列表提供。

于 2013-10-22T01:50:51.160 回答