Как получить стандартный вывод из подпроцесса в Python? - PullRequest
0 голосов
/ 10 октября 2019

Мне нужно получить стандартный вывод подпроцесса в моем коде Python, чтобы я мог дополнительно обработать вывод в своем коде 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.

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"
  }
}

1 Ответ

0 голосов
/ 10 октября 2019

Рекомендуется использовать метод subprocess.run вместо ручного вызова Popen напрямую. Таким образом, результат будет примерно таким:

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

Также не рекомендуется использовать shell=True. Существуют угрозы безопасности.

...