python子进程子线程不退出?

python子进程子线程不退出?,python,Python,以下代码很奇怪: def exec_shell(args, pipe = True): pre_fun = None if pipe == True: pre_fun = lambda: signal.signal(signal.SIGPIPE, signal.SIG_DFL) process = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE,

以下代码很奇怪:

def exec_shell(args, pipe = True):
    pre_fun = None
    if pipe == True:
        pre_fun = lambda: signal.signal(signal.SIGPIPE, signal.SIG_DFL)

    process = subprocess.Popen(args, stdout=subprocess.PIPE,
        stderr=subprocess.PIPE,
        preexec_fn = pre_fun)
    (out, err) = process.communicate() 
当我执行一个复杂的shell脚本时, 如果我将管道设置为true: 错误将是: 当2个线程正在运行时,一个线程退出 如果我将管道设置为false,错误将是:管道破裂


谁能帮我?谢谢

您可以使用更简单的os.popen()函数。我的程序中的示例:

import os
manifest = os.popen("aapt dump badging " + apk).read() #running command
for info in manifest.splitlines():
    ...  # extracting values

此外,子流程模块有一个错误:如果在subprocess.Popen()中指定了非ascii路径,则会发生错误。

您将函数作为
参数传递什么?将参数
pipe
设置为True只会设置SIGPIPE信号的默认处理程序,否则会终止进程,因此会出现不同的错误。所以我猜无论是什么命令
args
都试图写入一个管道,该管道被关闭,您的命令将以SIGPIPE终止。您可以尝试在命令行上运行
args
,查看是否出现断管错误。@EricAppelt命令run ags没有断管,但该命令正在执行一个shell脚本文件,但确实有一些重新更正…如果不了解更多关于
args
的内容,很难判断问题可能是什么,但是您可以尝试将参数
shell=True
添加到
subprocess.Popen
。但是要小心-如果
args
是由其他人提供的未初始化输入,则通常不应使用此选项。但您可以尝试使用os.popen)