【发布时间】:2015-12-31 20:44:40
【问题描述】:
在 Windows 上,Python (2) 的标准库例程 subprocess.Popen 允许您为 CreateProcess 指定任意标志,并且您可以从以下位置访问新创建进程的 process 句柄Popen 返回的对象。但是,新创建进程的初始线程的 thread 句柄在 Popen 返回之前被库关闭。
现在,我需要创建一个暂停的进程(CREATE_SUSPENDED 在创建标志中),以便我可以在它有机会执行任何代码之前对其进行操作(特别是,将其附加到作业对象)。但是,这意味着我需要线程句柄才能从暂停中释放进程(使用ResumeThread)。我能找到恢复线程句柄的唯一方法是使用“工具帮助”库来遍历整个系统上的所有线程(例如,参见this question and answer)。这工作,但我不喜欢它。具体来说,我担心每次我需要创建一个进程时对系统上的所有线程进行快照会太昂贵。 (较大的应用程序是一个测试套件,使用进程进行隔离;它以每秒数十到数百个的速度创建和销毁进程。)
所以,问题是:如果您只有进程句柄和Python 2 标准库(包括 ctypes,但 不是 winapi 附加组件)? Vista 和更高版本的技术是可以接受的,但最好与 XP 兼容。
【问题讨论】:
-
你可以让你的新线程首先等待一个全局(或命名)事件对象;然后只需调用
SetEvent释放它。这可能会给你类似的结果。 -
@JonathanPotter 唉,我不控制正在执行的程序的代码。
-
似乎不太可能有任何其他明智的方法来找到主线程,但我认为您会发现与启动进程的成本相比,所涉及的开销并不显着。有没有办法自己调用 CreateProcess 而不是使用 .POpen?
-
@HarryJohnston 没有办法将 Popen 对象包装在手动调用 CreateProcess 的结果周围,并且调用代码需要一个 Popen 对象(或者,更准确地说,我不想重新发明所有子流程模块中的底层管道相关知识)。
-
好的。鉴于所有的限制,我认为答案必须是“不”,没有任何更有效的方法可以做到这一点。如果我们放宽约束,您可以,哦,挂钩 CreateProcess,或使用 Python 的自定义构建,或类似的东西。但我真的认为,如果您进行测量,您会发现流程快照不会增加任何重大开销。如果它甚至比启动流程的成本高出 1%,我会感到惊讶。
标签: python winapi python-2.x