【问题标题】:Python inter-process communication, getting pid of an independent process (not child) started from another Python processPython进程间通信,获取从另一个Python进程开始的独立进程(不是子进程)的pid
【发布时间】:2013-02-21 14:04:09
【问题描述】:

我有一个感觉应该很简单的问题。附带说明一下,我已经在使用multiprocessing 模块,所以我有点不愿意使用subprocess 模块。无论如何,我有一个 Python 程序 foo.py,它通过 os.system() 函数启动另一个 Python 程序 bar.py

os.system("start python bar.py")

由于其他复杂的原因,必须以这种方式完成,而不是启动某种子进程。问题是,我想知道bar.py 的pid。这样做的最优雅或最有效的方法是什么?目前我正在通过使用bar.py 将其pid 写入一个临时文件以供foo.py 读取来解决这个问题,但我觉得必须有更好的方法。

顺便说一句,bar.py 显然很容易知道foo.py 的 pid,因为foo.py 可以使用os.system 将其作为命令行参数传入。

【问题讨论】:

    标签: python process communication pid


    【解决方案1】:

    多处理!= 子进程

    您仍然可以在多处理中使用子进程,而不是 os.system('...') 并通过在 Popen 对象上键入“.pid”来获得所需的内容。

    如您所见here,子进程可以(而且您应该使用它!)替换 os.system。

    在您的情况下,您需要进程 ID,因此您可以创建一个 Popen 对象,就像在 here 找到的示例中一样。 那么我们来写几行代码:

    import subprocess
    args = ['/path/to/python', 'bar.py']
    process = subprocess.Popen(args, shell=True, creationflags=subprocess.CREATE_NEW_CONSOLE) # you can also set only shell=True
    print process.pid
    

    【讨论】:

    • 我知道multiprocessing != subprocess,这正是我要说的。鉴于我使用的是multiprocessing,我不愿意使用subprocess。你能扩展“打字.pid”和Popen吗?我以前从未使用过subprocess
    • 谢谢马克。 os.system()subprocess.Popen() 之间的区别似乎如下。我的问题中显示的命令将打开一个新的命令提示符窗口(在 Windows 中)并在该新窗口中运行 bar.py,这正是我所需要的。您的process = subprocess.Popen(args) 命令将在同一窗口中运行bar.py。如何使用subprocess 在单独的窗口中运行bar.py
    • 在 Popen 构造函数中设置 creationFlags=subprocess.CREATE_NEW_CONSOLE。 (你也可以使用 shell=True)
    • 谢谢,解决了我的问题!虽然有两件事:1. shell=True 对我不起作用。也许它只适用于Linux? 2. 不是creationFlags,而是creationflags。再次感谢马康!也许编辑您的帖子以将 creationFlags 更改为 creationflags 以防其他人阅读此内容?
    • 操作!但是,这很奇怪,因为如果您阅读文档,它会说:“当使用 shell=True 创建 Popen 时,始终设置此标志。” Bha .. mmh 但是我很高兴它对你有用:)
    猜你喜欢
    • 1970-01-01
    • 2017-07-22
    • 2015-12-20
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多