【问题标题】:How to get the std out of the sub process in Python?如何在 Python 中获取子进程的标准输出?
【发布时间】:2019-10-10 08:10:46
【问题描述】:

我需要在我的 python 代码中从子进程中取出 std,这样我就可以在我的 python 代码中进一步处理输出。

我在 python 中有以下代码来获取标准输出,但输出变量有一个空值。

import subprocess
import json
import time


class RunProcess:
    waitTime = 0

    def SetWaitTime(self, waitingTimeInMSec):
        self.waitTime = waitingTimeInMSec

    def Run(self, filePath, arguments):
        if self.waitTime > 0:
            time.sleep(self.waitTime)
        process = subprocess.Popen(filePath + arguments, stdout=subprocess.PIPE, stderr=None, shell=True)
        output = process.communicate()[0]
        print(output)


if __name__ == '__main__':
    p = RunProcess()
    p.Run("C:\Projects\ATR220-Test\ATR220_Python_Tester\DeviceLoad\SerialReadWrite\srw.exe", " list=PID_0180")

但是当我从 Windows 命令提示符运行时,应用程序将我的工作室提供给我,这意味着我正在调用的应用程序没有问题。所以我怀疑我的python代码中的问题。

从 Windows 命令提示符运行 exe 时的输出。

C:\>C:\Projects\ATR220-Test\ATR220_Python_Tester\DeviceLoad\SerialReadWrite\srw.exe list=PID_0180

C:\>
{
  "list": [
    {
      "availability": "2",
      "name": "COM3",
      "friendlyname": "USB Serial Device (COM3)",
      "pnpdevicepath": "USB\\VID_0DB5&PID_0180&MI_02\\7&8A6C74D&0&0002"
    }
  ],
  "status": {
    "value": 0,
    "description": "ok"
  }
}

【问题讨论】:

  • “工作室”?我想你可能想说“标准输出”
  • 感谢并更正
  • 检查 stderr 和 process.returncode 应该是 0。你需要转义反斜杠:p.Run("C:\\Projects\\...")

标签: python subprocess output


【解决方案1】:

建议使用subprocess.run方法,而不是直接手动调用Popen。这样输出就会像这样

output = subprocess.run([filePath, arguments], stdout=subprocess.PIPE)
output.stdout.decode('utf-8')

而且它不是good idea to use shell=True。存在安全风险。

【讨论】:

  • @Raj Nice :) 如果这成功了,您可以将其标记为已回答
  • 哦,这很奇怪:? this might help
猜你喜欢
  • 2020-03-03
  • 1970-01-01
  • 2016-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-29
  • 1970-01-01
  • 2015-01-20
相关资源
最近更新 更多