2017-01-18 14 views
2

Я пытаюсь запросить статус службы Windows с помощью метода «Popen» модуля подпроцесса. Но я получаюTypeError: объект «Popen» не является вызываемым

TypeError: объект '' 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 
+2

попробуйте удалить скобки из pDetails() в строке 'для элемента в pDetails():' поэтому он будет 'для элемента в pDetails:' вместо – RichSmith

ответ

3

Похоже, что вы хотите, чтобы собрать стандартный вывод подпроцесса , Вам нужно будет использовать 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).

Смежные вопросы