在Windows上的os.exec

13

我有一个脚本,调用os.execvp来启动另一个Python实例。然而,在这样做之后,我似乎被连接到了一个cmd.exe实例,而不是刚刚创建的Python实例。不过,该Python实例会响应Ctrl+C

H:\bin>Python 3.2.1 (default, Jul 10 2011, 21:51:15) [MSC v.1500
 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> print('hi')
Can't find file ('hi')

H:\bin>

H:\bin>
KeyboardInterrupt
>>> echo hi
hi

调用 exec 函数:
from sys import argv
os.execvp('python', argv)

如何替换原始Python实例为新的实例,使其行为类似于Linux上可能看到的行为?


相关:http://bugs.python.org/issue9148。根据Amaury Forgeot d'Arc的[评论](http://bugs.python.org/issue9148#msg109179) - 在Windows上,exec()并不真正替换当前进程。它创建一个新进程(具有新pid),并退出当前进程。因此,调用程序只看到脚本已终止。我没有看到在Windows上有任何简单的解决方案,除非使用subprocess.Popen(),并在子进程终止时退出脚本。 在您的情况下,这是否是可能的解决方案? - Piotr Dobrogost
感谢@PiotrDobrogost的有用评论。如果您将Python问题中的材料与此问题相关联,那将构成一种解决方案。 - Matt Joiner
你的意思是先调用 subprocess.Popen(),然后退出原始的 Python 进程吗? - Piotr Dobrogost
@PiotrDobrogost:是的,为了那些遇到同样问题的人们,他们应该得到一个干净的解决方案和理由。 - Matt Joiner
@MattJoiner 你好,我在尝试将一个库移植到Windows时偶然发现了这个问题。我正在努力寻找一个基于subprocess.Popen的完整可用示例。有任何想法在哪里可以找到吗? - s-m-e
@s-m-e 抱歉,不行。 - Matt Joiner
1个回答

4

你能提供一个关于Windows上os.exec*行为差异的链接吗?我本以为exec在Windows上是被支持的,参见这里 - Matt Joiner
在您发布的URL的第一段中:“此函数族中的每个函数都会加载并执行一个进程”。在MS CRT中,它们只是CreateProcess的包装器。 - Zart
当调用_exec函数成功时,新进程被放置在先前由调用进程占用的内存中。必须有足够的内存来加载和执行新进程。此外,在示例exec调用之后,有一个注释/* This point is reached only if exec fails. */ - Matt Joiner
我怀疑这行代码是从 POSIX.1 规范中直接复制的。"This point is reached":请参阅任何 _exec 的描述,"Return value" 条款。如果成功,这些函数不会返回到调用进程,而是在成功调用 CreateProcess() 后进行 ExitProcess() 调用(如我所记得的)。 - Zart
有关CreateProcess内部工作原理的详细信息,请参阅http://www.scribd.com/doc/51979000/122/Flow-of-CreateProcess。 - Zart
那行代码来自于MSDN文档。 - Matt Joiner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接