Python 2.7.3 process.Popen()失败

时间:2012-10-03 17:33:05

标签: process python-2.7 windows-7-x64

我目前在Windows 7 64位机器上使用python 2.7.3(也在Linux 32位,Ubuntu 12.04中开发),并且在使用python成功与命令提示符/终端通信方面遇到了奇怪的困难。我的代码如下所示:

import subprocess, logging, platform, ctypes

class someClass (object):

def runTerminalCommand:

    try:
        terminalOrCmdLineCommand = self.toString()

        process = subprocess.Popen(terminalOrCmdLineCommand, shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
        output = process.stdout.readlines()

        if len(output) < 1:
            logging.exception("{} error : {}".format(self.cmd,process.stderr.readlines()))
            raise ConfigError("cmd issue : {}".format(self.cmd))
        return output

    except ValueError as err:
        raise err
    except Exception as e:
        logging.exception("Unexpected error : " + e.message)
        raise ConfigError("unexpected error")

现在,我知道如果我手动输入self.toString()返回值将正确处理,所以我将这限制为我如何通过子进程将其发送到命令行的问题。我已经阅读了文档,发现如果遇到错误,subprocess.check_call()不返回任何内容,所以我使用.Popen()

我得到的例外是,

    [date & time] ERROR: Unexpected error :
    Traceback (most recent call last):
      File "C:\[...]"
        raise ConfigError("cmd issue : {}".format(self.cmd))
    "ConfigError: cmd issue : [the list self.cmd printed out]"

我正在尝试做的是运行命令,然后读回输入。但我似乎无法自动执行我想要运行的调用。 :(

有什么想法? (如果我遗漏了任何必要的细节,请告诉我)

事先得到很多赞赏。

1 个答案:

答案 0 :(得分:11)

The docs say

  

使用communic()而不是.stdin.write,.stdout.read或   .stderr.read以避免由于任何其他OS管道导致的死锁   缓冲填充和阻止子进程。

您可以使用.communicate(),如下所示:

p = Popen(cmd, stdout=PIPE, stderr=PIPE)
stdout_data, stderr_data = p.communicate()
if p.returncode != 0:
    raise RuntimeError("%r failed, status code %s stdout %r stderr %r" % (
                       cmd, p.returncode, stdout_data, stderr_data))
output_lines = stdout_data.splitlines() # you could also use `keepends=True`

请参阅other methods to get subprocess output in Python