在 Mac OS X 上使用 Python 生成一个新的非阻塞进程

Posted

技术标签:

【中文标题】在 Mac OS X 上使用 Python 生成一个新的非阻塞进程【英文标题】:Spawn a new non-blocking process using Python on Mac OS X 【发布时间】:2011-09-20 11:20:24 【问题描述】:

我找到了一些文章甚至堆栈|溢出问题解决了这个问题,但我仍然做不到..

我想做的是从python打开一个firefox实例。那么python应用就应该管好自己的事,忽略firefox进程。

我能够在 Windows-7 和 XP 上使用:

subprocess.Popen()

在 OS X 上我试过:

subprocess.Popen(['/Applications/Firefox.app/Contents/MacOS/firefox-bin'])
subprocess.call(['/Applications/Firefox.app/Contents/MacOS/firefox-bin'])
subprocess.call(['/Applications/Firefox.app/Contents/MacOS/firefox-bin'], shell=True)
os.system('/Applications/Firefox.app/Contents/MacOS/firefox-bin') 

(可能还有一些我忘记了)无济于事。我的 python 应用程序冻结,直到我关闭 firefox 应用程序。

我在这里缺少什么?有什么线索吗?

【问题讨论】:

这个以前的答案对我有用:***.com/questions/832331/… Firefox 只是这种情况下的一个例子(这就是它不在标题或标签中的原因)。我的进程需要能够打开任何其他进程。 【参考方案1】:

为了说明我的意思:

import os
if not os.fork():
    os.system('firefox')
os._exit(0)

不退出主要 Python 进程的版本:

import os
if not os.fork():
    os.system('firefox')
    os._exit(0)

【讨论】:

【参考方案2】:

您需要以某种方式分离进程。我从spawning process from python 抢到了这个

import os
pid = os.fork()
if 0 == pid:
  os.system('firefox')
  os._exit(0)
else:
  os._exit(0)

这会生成相同脚本的分叉无头版本,然后可以执行您喜欢的任何内容并在之后直接退出。

【讨论】:

你可以简化很多。不幸的是,我真的不能把它放在这个评论中。 我想过走这条路,甚至试了一下,但没能成功。你的代码让我的主进程退出.. @Leeron:当你说“我的主进程”时,你指的是 firefox 还是 python 脚本? os._exit 调用退出该过程,因此如果您指的是您的 python 脚本并且您不希望它在之后立即退出,只需删除该行。 @Robin:是的,你可以,但它会让序列更容易理解吗? 在子进程中(你的代码没有 else 块)使用 fork 并调用 os.system 然后调用 os._exit (你的代码没有 else 块)谢谢

以上是关于在 Mac OS X 上使用 Python 生成一个新的非阻塞进程的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Mac OS X Lion 上安装 Python 库“gevent”

python 在os x或mac os上使用python中的syslog - 来自https://stackoverflow.com/questions/30125412/how-can-i-log

如何在 mac os x 上使用 gunicorn 和 python3.8 而不是 python3.9?

在 Mac OS X 10.6 上使用带有 Python 2.7 的 Google App Engine SDK

如何在 Mac OS X *和* Debian (7) 上使用 SysLogHandler 或 syslog 从 Python 登录到 syslog

使用 Qt 在 OS X/Mac 上构建 C++ 库