Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:subprocess.Popen和subprocess.call挂起_Python - Fatal编程技术网

Python:subprocess.Popen和subprocess.call挂起

Python:subprocess.Popen和subprocess.call挂起,python,Python,当我使用subprocess.Popen或subprocess.call执行生成大量输出的命令行时,python脚本会挂起,但奇怪的是,在等待一段时间后,当脚本处于挂起状态时,我发现cmd行命令的作业已经完成,只有剧本挂了出来 subprocess.call(cmd, shell = True) #OR subprocess.Popen(cmd, stdout = subprocess.PIPE, stdin = subprocess.PIPE, shell = True) # HANGS HE

当我使用subprocess.Popen或subprocess.call执行生成大量输出的命令行时,python脚本会挂起,但奇怪的是,在等待一段时间后,当脚本处于挂起状态时,我发现cmd行命令的作业已经完成,只有剧本挂了出来

subprocess.call(cmd, shell = True)
#OR
subprocess.Popen(cmd, stdout = subprocess.PIPE, stdin = subprocess.PIPE, shell = True)
# HANGS HERE
print "show something after subprocess"
请注意,最后一次打印从未执行,但实际上已执行cmd

请注意,cmd与串行端口相关,因此当我拔出串行电缆时,一切都会变好,并执行最后一个打印状态。但是当我使用终端时,即使插入了串口,一切都很好,它只在python脚本中出现


非常感谢

根据python文档,
subprocess.call
运行命令并等待它完成,因此它相当于
subprocess.Popen
后跟
Popen.wait

但是,
Popen.wait
方法文档明确警告缓冲区溢出问题,并建议改用
Popen.communicate
。因此,您正在寻找的解决方案应该是:

import subprocess
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stdin=subprocess.PIPE, shell=True)
stdout, stderr = process.communicate()
print "show something after subprocess"

我不明白为什么您的第一行不起作用-因为没有
stdin
/
stdout
/
stderr
重定向,所以不需要阻止

第二个应该会阻止进程

  • 需要通过标准输入法或
  • 向标准输出发送的数据超过管道在不读取的情况下所能容纳的数据量

  • 但由于您的子进程正确终止,我看不出阻塞的原因。你确定它真的终止了吗?

    使用
    子流程没有问题。如果你不使用
    子流程.PIPE
    ,调用
    ,而OP不是。它没有解释为什么
    print
    语句的输出不显示在父语句中
    Popen()
    不等待子进程,即使子进程在尝试使用完整缓冲区写入管道时被阻止。