Ошибка типа: объект Popen не вызывается

Я пытаюсь запросить состояние службы Windows, используя метод Popen модуля подпроцесса. Но я получаю

Ошибка типа: объект Popen не вызывается

import subprocess, codecs

def serviceStatus(RadiaService):
    status = []
    cmd = 'sc query ' + RadiaService
    pDetails = subprocess.Popen(cmd, shell = True, stdout = subprocess.PIPE)
    for item in pDetails():
        status.append(item)
    finalStatus = b''.join(status).decode('utf-8')
    print(finalStatus)

if __name__ == '__main__':
    serviceStatus('RCA')

Трассировка ошибок:

Traceback (most recent call last):
  File "C:\Alen\Cumulative RHF\Radia_Cumulative_Patch\cumulativeHotFixproject\lib\win32.py", line 39, in <module>
    serviceStatus('RCA')
  File "C:\Alen\Cumulative RHF\Radia_Cumulative_Patch\cumulativeHotFixproject\lib\win32.py", line 33, in serviceStatus
    for item in pDetails():
TypeError: 'Popen' object is not callable

1 ответ

Решение

Похоже, вы хотите собрать стандартный вывод подпроцесса. Вам придется использовать pDetails.stdout, Вот пример, чтобы помочь вам начать:

import subprocess
p = subprocess.Popen("ls -la", shell=True, stdout=subprocess.PIPE)
output = b''.join(p.stdout).decode('utf-8')
print(output)

Исходя из этого, ваш код должен выглядеть так:

import subprocess, codecs

def serviceStatus(RadiaService):
    cmd = 'sc query ' + RadiaService
    pDetails = subprocess.Popen(cmd, shell = True, stdout = subprocess.PIPE)
    return b''.join(pDetails.stdout).decode('utf-8')

def main():
    print(serviceStatus('RCA'))

if __name__ == '__main__':
    main()

Примечание: вам не нужно собирать выходные данные в список, вы можете передать итерируемое непосредственно для присоединения. Если вам нужен список, вам все равно не нужно использовать цикл for, вы можете просто написать status = list(pDetails.stdout),

Другие вопросы по тегам