繁体   English   中英

例如,在Python 2.4脚本中,我想执行os系统调用`ls -l`或`curl`并将输出捕获到变量中。 这个怎么做?

[英]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.txtls -ltrh之类的命令,并将这些命令的输出捕获到一个变量中。 对于curl命令,输出将是我将解析的json格式(请告知是否有旧的json解析器可供我使用)。

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

先感谢您!

您不能直接使用os.systemos任何其他工具来执行此操作。 正如文档 *告诉您的那样,它只是在子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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM