在OS X的后台运行Python

时间:2012-03-01 19:05:21

标签: python macos daemon

有没有办法让我的Python脚本(带有无限的'while'循环)在OS X的后台运行?另外,出于同样的目的,有没有办法在USB驱动器上安装“自动运行”python脚本?

5 个答案:

答案 0 :(得分:33)

如果您希望脚本作为自动启动的守护进程运行,您可以使用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)

要让它作为守护进程运行,请使用以下内容创建一个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>

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

launchctl load ~/Library/LaunchAgents/com.bobbob.osx.test.plist

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

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

launchctl unload ~/Library/LaunchAgents/com.bobbob.osx.test.plist

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

至于自动编写脚本,我认为没有办法做到这一点。

答案 1 :(得分:2)

有关在Unix系统上守护python脚本的方法,请参阅此问题: Python Daemon Packaging Best Practices

当然,如果你需要,你可以随时在后台运行脚本。

答案 2 :(得分:1)

只需使用shell以常规方式在后台运行Python脚本:

python myscript.py &

至于自动运行问题,如果它是Mac OS X默认执行的操作,这将是一个巨大的安全漏洞,所以,当然不是。但是你可以轻松编写一个脚本来实现这样的目的:定期查找插入的USB驱动器,并在插入时执行某些操作(甚至从拇指驱动器运行第二个脚本)。

答案 3 :(得分:1)

我尝试了launchctl并且无法让它在El Capitan中运行并且再搜索一下并找到了post

<强> TL; DR

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

chmod +x test.py
nohup /path/to/test.py &
ps ax | grep test.py

答案 4 :(得分:0)

你可以使用nohup https://linux.die.net/man/1/nohup

$ nohup python <your_script.py> &

这将运行您的进程并将输出附加到同一目录中的文件nohup.out。 &安培;将按照其他答案的说明在后台运行脚本。