我想运行一个进程,而不是等待它返回。我已尝试使用P_NOWAIT和subprocess这样生成:
app = "C:\Windows\Notepad.exe"
file = "C:\Path\To\File.txt"
pid = subprocess.Popen([app, file], shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE).pid
但是,在我关闭记事本之前,控制台窗口仍然存在。是否有可能启动该过程而不是等待它完成?
答案 0 :(得分:45)
此调用不会等待子进程终止(在Linux上)。不要问我close_fds
做了什么;几年前我写了代码。 (顺便说一下:subprocess.Popen
的文件令人困惑,恕我直言。)
proc = Popen([cmd_str], shell=True,
stdin=None, stdout=None, stderr=None, close_fds=True)
修改强>
我查看了subprocess的文档,我相信你的重要方面是stdin=None, stdout=None, stderr=None,
。否则 Popen 会捕获程序的输出,并且您需要查看它。 close_fds
使父进程'文件句柄对子进程无法访问。
答案 1 :(得分:19)
我终于开始工作了。我正在运行“Python 2.6.6(r266:84297,2010年8月24日,18:13:38)[MSC v.1500 64 bit(AMD64)] win32”。以下是我编写代码的方法:
from subprocess import Popen
DETACHED_PROCESS = 0x00000008
cmd = [
sys.executable,
'c:\somepath\someprogram.exe',
parm1,
parm2,
parm3
]
p = Popen(cmd,shell=False,stdin=None,stdout=None,stderr=None,close_fds=True,creationflags=DETACHED_PROCESS)
这将关闭标准输入/输出的所有管道,并且不会在shell中执行被调用的程序。将'creationflags'设置为DETACHED_PROCESS似乎对我有用。我忘了我发现它的地方,但是使用了一个例子here。
答案 2 :(得分:1)
我认为实现这一点的简单方法是使用传递@Component({
selector: // My selector
templateUrl: // My template URL
})
export class AlarmComponent {
@Input() alarm;
@ViewChild(MdMenuTrigger) trigger: MdMenuTrigger;
// ...
private onContextMenu($event: Event, alarm: Alarm): void {
this.trigger.openMenu();
$event.preventDefault();
}
标志的os.spawn*系列函数。
例如,这将生成一个P_NOWAIT
进程,将大文件复制到一个新目录,而不必费心等待它。
cp
答案 3 :(得分:0)
您正在捕获程序的输入和输出,因此只要打开这些文件描述符,您的程序就不会终止。如果要捕获,则需要关闭文件描述符。如果您不想捕获:
app = "C:\Windows\Notepad.exe"
file = "C:\Path\To\File.txt"
pid = subprocess.Popen([app, file]).pid