【问题标题】:How to get the returncode using subprocess如何使用子进程获取返回码
【发布时间】:2019-08-04 06:00:30
【问题描述】:

所以我试图执行一个文件并使用子进程库中可用的 python 内置方法取回返回值。

例如,假设我要执行这个 hello_world python 文件:

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, '')

谁能帮忙?

【问题讨论】:

  • 我不知道有任何操作系统支持非数字返回码。如果要将字符串'hello world!' 传递给父进程,则需要通过文件或通过stdout/stderr。
  • @0x5453 即使返回值是一个值而不是hello world!,仍然,以上都不行!

标签: python scripting subprocess


【解决方案1】:

您不能将字符串作为返回码返回,它必须是整数。如果您想根据流程采取不同的行动。尝试将返回码映射到主程序中的某个函数。例如

def execute_sub_program(): ... 

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

【讨论】:

    【解决方案2】:

    您可以尝试subprocess.run().returncode,如果执行成功则返回 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()
    

    【讨论】:

      【解决方案3】:

      主函数的返回值不是传递给操作系统的返回码。要将返回码传递给操作系统,请使用sys.exit(),它需要一个整数。您可以向它传递一个字符串,但如果这样做,Python 会将 1 传递给操作系统。

      【讨论】:

        猜你喜欢
        • 2020-10-04
        • 1970-01-01
        • 2018-09-09
        • 2012-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-18
        • 2018-12-01
        相关资源
        最近更新 更多