我在Windows中假设我有一个主python代码,它在命令行中调用python interpreter来执行另一个python脚本,比如test.py。
所以test.py作为一个新进程执行。如何在Python中找到这个porcess的processId?
更新
更具体地说,我们在os模块中有os.getpid()。它返回当前进程ID。
如果我有一个运行Python解释器的主程序来运行另一个脚本,我怎样才能获得该执行脚本的进程ID?
答案 0 :(得分:20)
如果您使用subprocess生成shell,则可以在pid
属性中找到进程ID:
sp = subprocess.Popen(['python', 'script.py'])
print('PID is ' + str(sp.pid))
如果您使用了多处理,请使用其 pid属性:
p = multiprocessing.Process()
p.start()
# Some time later ...
print('PID is ' + str(p.pid))
答案 1 :(得分:5)
这完全取决于你如何启动第二个过程。
如果您使用os.system
或类似内容,则该调用不会报告有关子进程的pid的任何有用信息。一种选择是让您的第二个脚本通过stdin / stdout将os.getpid()
的结果传回原始进程,或将其写入预定的文件位置。另一种方法是使用第三方psutil
库来确定它是哪个进程。
另一方面,如果您使用subprocess
模块启动脚本,则生成的“popen”对象具有属性popen.pid
,该属性将为您提供进程ID。
答案 2 :(得分:0)
创建新进程时,您将收到新进程的进程ID。至少,如果您使用fork()(Unix),posix_spawn(),CreateProcess()(Win32)或者可能使用任何其他合理的机制来创建它。
如果调用“python”二进制文件,则python PID将是您调用的此二进制文件的PID。它不会为自己创建另一个子进程(除非你的python代码那样做。)
答案 3 :(得分:0)
另一个选择是您执行的过程将为自己设置控制台窗口标题。 搜索过程将枚举所有窗口,按名称查找相关窗口句柄并使用句柄查找PID。它适用于使用ctypes的Windows。