背景
我需要创建一个在启动时运行的 python 脚本。问题是该脚本必须独立于平台,因为它将用于不同的操作系统。它需要自动设置,因为它将由用户运行,因此我无法在每台机器上设置任务调度程序。
问题
- 如何找出计算机在 Python 中运行的操作系统?
- 如何让脚本在启动时运行(Linux、Mac OSX、Windows)
背景
我需要创建一个在启动时运行的 python 脚本。问题是该脚本必须独立于平台,因为它将用于不同的操作系统。它需要自动设置,因为它将由用户运行,因此我无法在每台机器上设置任务调度程序。
问题
问题1很简单:
如何找出计算机在 Python 中运行的操作系统?
那是sys.platform
:
if sys.platform.startswith('win') or sys.platform.startswith('cygwin'):
do_windows_stuff()
elif sys.platform.startswith('darwin'):
do_osx_stuff()
elif sys.platform.startswith('linux'):
do_linux_stuff()
else:
raise Exception("Nobody's written the stuff for {}, sorry".format(sys.platform))
第二部分也很简单,但不是您想听到的方式:
如何让脚本在启动时运行(Linux、Mac OSX、Windows)
你没有。不是来自脚本内部。您使用某种安装程序(或包 postflight 脚本,或其他)。
添加在启动时运行的东西需要 root/admin 权限。您的脚本(希望)没有以此类权限运行。因此,它做不到。是的,可以通过各种方式提升权限,但这几乎肯定不是您想要在最终在启动时运行的脚本中执行的操作。
那么,您的安装程序是如何做到的呢?
OS X:您需要创建一个 Launch Daemon,并附带一个 launchd plist。这在创建启动守护程序和代理中进行了描述。如果你没有读过那篇文章,你不应该尝试这样做,如果你读过那篇文章,你就会知道如何做,所以没有什么可说的了。
Windows:执行此操作的官方方法在Run 和 RunOnce Registry Keys中进行了说明。再说一遍,不读这篇文章你就不应该这样做,读完这篇文章后很明显,除了两件事:首先,在四个键中,它是 HKLM Run 键。其次,在现代 Windows 中,这实际上并不是在启动时运行,而是在启动后的第一次登录时运行;如果这不可接受,请RunServices
改为调查。
Linux:什么是安装程序?您是否期望为每个发行版家庭提供一种方法?除了确切地知道您想在每个发行版上做什么之外,本入门书为您提供了您需要的大部分信息。一般来说,如果你只想让你的脚本运行一次并退出,并且有一个rc.local.d
, 你只需要在其中放置一个链接。否则,您要么需要创建一个rc.d
脚本,将其安装到正确的位置,然后运行正确的chkconfig
命令,要么您需要编辑rc.local
运行你的脚本。但最简单的事情是:只需将英文文本放入 INSTALL 文件中,告诉人们这样做。最终,当有人决定为 Ubuntu 制作 DEB 或为 Redhat 制作 RPM 或其他任何东西时,他们会为他们的发行版做正确的事情,或者向您提交补丁或单独维护它。