我正在Windows 8/XP上使用Python 2.7。
我有一个程序A,它使用以下代码运行另一个程序B:
p = Popen(["B"], stdout=PIPE, stderr=PIPE)
stdout, stderr = p.communicate()
return
B运行一个批处理脚本C。C是一个长时间运行的脚本,我希望即使C没有完成,B也能退出。我已经使用以下代码(在B中)实现了这一点:
B运行批处理脚本C,即使C没有完成,也希望B能够退出。我使用以下代码(在B中)实现了这个目的:
p = Popen(["C"])
return
当我运行B时,它按预期工作。但是当我运行A时,我希望它在B退出后也能退出。但是A会等到C退出后才退出,尽管B已经退出了。有什么想法和可能的解决方案吗?
不幸的是,将A更改为类似B的明显解决方案不可行。
以下是一个功能示例代码,以说明这个问题: https://www.dropbox.com/s/cbplwjpmydogvu2/popen.zip?dl=1
该zip文件包括以下文件及其内容:
A.py
from subprocess import PIPE, Popen
import sys
def log(line):
with open("log.txt", "a") as logfile:
logfile.write(line)
log("\r\n\r\nA: I'll wait for B\r\n")
p = Popen(["C:\\Python27\\python.exe", "B.py"], stdout=PIPE, stderr=PIPE)
stdout, stderr = p.communicate()
log("A: Done.\r\n")
sys.exit(0)
B.py
from subprocess import Popen, PIPE
import sys
def log(line):
with open("log.txt", "a") as logfile:
logfile.write(line)
log("B: launching C\r\n")
p = Popen(["C.bat"])
log("B: Not waiting for C at all. bye!\r\n")
sys.exit(0)
C.bat
@echo off
echo C: Start long running task : %time% >> "log.txt"
ping -n 10 127.0.0.1>nul
echo C: Stop long running task : %time% >> "log.txt"
非常感谢您的反馈。
Popen
是来自程序B吗? - Some programmer dudePopen()
调用提供close_fds=True
参数有帮助吗?我猜 C 会继承 A 的标准输出/错误管道,因此 A 会等待直到 C 关闭它们。 - Simon