在OS X的后台运行Python

tkb*_*kbx 12 python macos daemon

有什么方法可以保持我的Python脚本(带有无限的'while'循环)在OS X的后台运行?另外,出于同样的目的,有没有办法在USB驱动器上安装"自动运行"python脚本?

mne*_*nem 35

如果要将脚本作为自动启动的守护进程运行,可以使用launchctl和plist文件.

例如,Bob有一个简单的python脚本,它在他的主目录中每秒将一个单词'foo'写入一个文件:

#!/usr/bin/env python
import os
import time

while True:
  os.system('echo " foo" >> /Users/bob/foostore.txt')
  time.sleep(1)
Run Code Online (Sandbox Code Playgroud)

要让它作为守护进程运行,请创建一个plist文件~/Library/LaunchAgents/com.bobbob.osx.test.plist,其中包含以下内容:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC -//Apple Computer//DTD PLIST 1.0//EN http://www.apple.com/DTDs/PropertyList-1.0.dtd >
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>com.bobbob.osx.test</string>
    <key>Program</key>
    <string>/Users/bob/pyfoo.py</string>
    <key>KeepAlive</key>
    <true/>
  </dict>
</plist>
Run Code Online (Sandbox Code Playgroud)

然后用来launchctl从终端加载plist:

launchctl load ~/Library/LaunchAgents/com.bobbob.osx.test.plist
Run Code Online (Sandbox Code Playgroud)

这将加载该脚本并立即在<string>下面的元素中运行该程序<key>Program</key>.您还可以使用具有元素<ProgramArguments>数组的节点为程序指定参数<string>.有关更多信息,请参见launchd.plist手册页

如果要删除脚本,可以使用以下命令的卸载命令launchctl:

launchctl unload ~/Library/LaunchAgents/com.bobbob.osx.test.plist
Run Code Online (Sandbox Code Playgroud)

脚本中使用的标签可以是任何内容,但它在您的系统上应该是唯一的,因此Apple通常使用反向域名.

至于自动运行脚本,我认为没有办法做到这一点.


iam*_*rem 5

我尝试过launchctl,但无法使其在 El Capitan 中工作,并进行了更多搜索,发现了这篇文章

长话短说

使用 shebang 行#!/usr/bin/env python#!/path/to/python在您的脚本上

chmod +x test.py
nohup /path/to/test.py &
ps ax | grep test.py
Run Code Online (Sandbox Code Playgroud)