【问题标题】:Spawn a new non-blocking process using Python on Mac OS X在 Mac OS X 上使用 Python 生成一个新的非阻塞进程
【发布时间】: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 应用程序。

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

【问题讨论】:

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

标签: python macos subprocess nonblocking


【解决方案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 块)谢谢
    猜你喜欢
    • 2011-05-03
    • 2013-11-13
    • 2012-10-19
    • 2013-05-24
    • 1970-01-01
    • 2013-05-16
    • 1970-01-01
    • 2014-03-23
    • 2015-05-23
    相关资源
    最近更新 更多