Как получить код возврата с помощью подпроцесса - PullRequest
1 голос
/ 13 марта 2019

Итак, я пытаюсь выполнить файл и получить возвращенное значение, используя встроенные методы python, доступные в библиотеке подпроцесса.

Например, допустим, я хочу выполнить этот файл python hello_world:

def main():
    print("in main")
    return("hello world!")

if __name__ == '__main__':
    main()

Меня не волнует возвращение заявления in main. То, что я хочу вернуть, это возвращаемое значение hello world!.

Я пробовал множество вещей, но ни одна из них не сработала.

Вот список того, что я пробовал, и их вывод:

args является общим для всех испытаний: args = ['python',hello_cmd]

Первое испытание:

p1 = subprocess.Popen(args, stdout=subprocess.PIPE)

print(p1.communicate())
print("returncode is:")
print(p1.returncode)

вывод:

(b'in main\n', None)
returncode is:
0

второе испытание:

p2 = subprocess.check_output(args,stderr=subprocess.STDOUT)
print(p2)

вывод:

b'in main\n'

третье испытание:

output, result = subprocess.Popen(args, stdout = subprocess.PIPE, stderr = subprocess.PIPE, shell=False).communicate()
print(output)
print(result)

вывод:

b'in main\n'
b''

четвертое испытание:

p4 = subprocess.run(args, stdout=PIPE, stderr=PIPE)
print(p4)

вывод:

CompletedProcess(args=['python', '/path/to/file/hello.py'], returncode=0, stdout=b'in main\n', stderr=b'')

пятое испытание:

p5 =subprocess.getstatusoutput(args)
print(p5)

вывод:

(0, '')

Может кто-нибудь помочь?

Ответы [ 3 ]

2 голосов
/ 13 марта 2019

Возвращаемое значение основной функции не является кодом возврата, который передается в ОС.Для передачи кода возврата в ОС используйте sys.exit(), который ожидает целое число.Вы можете передать ей строку, но если вы это сделаете, Python передаст 1 в ОС.

0 голосов
/ 13 марта 2019

Вы можете попробовать с subprocess.run (). Код возврата , он дает 0 при успешном выполнении и 1 при неудачном выполнении.


driver.py

import subprocess

args = ['python', './hello_cmd.py']
status_code = subprocess.run(args).returncode
print(["Successful execution", "Failed execution"][status_code])

Для счастливого потока (hello_cmd.py):

def main():
    print("in main")
    return("hello world!")

if __name__ == '__main__':
    main()

Для сбойного потока (hello_cmd.py):

def main():
    print("in main")
    raise ValueError('Failed')

if __name__ == '__main__':
    main()
0 голосов
/ 13 марта 2019

Вы не можете возвращать строки как коды возврата, это должно быть целое число.Если вы хотите действовать по-разному в зависимости от процесса.Попробуйте сопоставить ваш код возврата с какой-либо функцией в вашей основной программе.Например

def execute_sub_program(): ... 

# somewhere else:
return_code = execute_sub_program()
if return_code == 0: 
    # do something ...
elif ...
...