在OS X上后台运行Python

19
有没有办法在Mac系统上让我的Python脚本(含有无限循环'while')在后台运行?同样地,为了相同的目的,是否可以让USB驱动器上的Python脚本“自启动”?

我认为对于问题的第一部分,screen 应该是可以的。 - Robus
5个回答

51
如果你想将脚本作为守护进程自动启动,你可以使用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

这将加载该脚本并立即运行位于<key>Program</key>下方的<string>元素中的程序。您还可以使用<ProgramArguments>节点指定程序的参数,其中包含一组<string>元素。有关更多信息,请参见launchd.plist man page
如果要删除该脚本,您可以使用launchctl的卸载命令:
launchctl unload ~/Library/LaunchAgents/com.bobbob.osx.test.plist

脚本中使用的标签可以是任何内容,但在您的系统上应该是唯一的,因此苹果公司通常使用反转域名。 至于自动运行脚本,我认为没有任何方法可以实现。

1
如果您有一个Python虚拟环境呢? - Gary Dorman
1
如果你有一个Python虚拟环境,会怎么样呢? - Gary Dorman

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

2

请参考以下问题,了解在类Unix系统上将Python脚本转换为守护进程的方法: Python Daemon Packaging Best Practices

当然,如果这是您所需的全部内容,您也可以像kindall提到的那样在后台运行脚本。


1
你可以使用nohup命令。https://linux.die.net/man/1/nohup
$ nohup python <your_script.py> &

这将运行您的进程,并将输出附加到同一目录中的文件nohup.out中。& 将在后台运行脚本,如其他答案所解释的那样。

1

只需按照通常的方式在 shell 中将 Python 脚本后台运行:

python myscript.py &

关于自动运行的问题,如果这是Mac OS X默认执行的操作,那么这将是一个巨大的安全漏洞,所以当然不会。但是你可以轻松地编写一个脚本来实现类似的功能:定期检查插入的USB驱动器,并在插入时执行某些操作(甚至从U盘运行第二个脚本)。

1
但是当 shell 关闭时,它不会继续运行,对吗? - tkbx
是的,你说得对。我从来没有关闭我的shell,所以我没有考虑过那个问题。一个更好的选择可能是一个AppleScript小应用程序,可以启动脚本。 - kindall

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接