在OSX启动时运行Python脚本

在OSX启动时运行Python脚本,python,macos,plist,launchctl,Python,Macos,Plist,Launchctl,我有一个Python脚本,我想在登录到Mac时立即执行。我在网上尝试过各种方法。但它们似乎都不起作用 我尝试将com.username.scriptname.plist文件放在Library/LaunchAgents中 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList

我有一个Python脚本,我想在登录到Mac时立即执行。我在网上尝试过各种方法。但它们似乎都不起作用

我尝试将
com.username.scriptname.plist
文件放在Library/LaunchAgents中

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>com.username.scriptname</string>

  <key>Program</key>
  <string>/Users/username/scriptlocation/scriptname.py</string>

  <key>RunAtLoad</key>
  <true/>

  <key>StandardErrorPath</key>
  <string>/tmp/com.username.scriptname.err</string>

  <key>StandardOutPath</key>
  <string>/tmp/com.username.scriptname.out</string>
</dict>
</plist>

当我有一个Python文件时,它是如何显示scriptname.sh的,这很奇怪

这个
.plist
看起来是正确的,所以一定是出了什么问题(我猜:不可执行或脚本路径错误)

您可以执行哪些调试操作:

  • 检查syslog中关于您的作业的内容:
    grep com.username.scriptname/var/log/syslog
    。可能有类似于
    com.apple.xpc.launchd[1](com.username.scriptname[PID]):无法找到和/或执行服务指定的程序:13:权限被拒绝:/Users/username/scriptlocation/scriptname.py
  • 检查launchd对您的工作有何评论:
    launchctl list com.username.scriptname
  • 另外:
    launchctl list | grep com.username.scriptname
    说了什么
还请注意
man launchd.plist
要说的话:

RunAtLoad
此可选键用于控制在加载作业时是否启动作业一次。默认值为false。这把钥匙应该是 避免,因为投机性作业启动会对系统启动和用户登录场景产生不利影响


执行launchctl命令时会出现以下错误<代码>路径的所有权/权限不正确@GreyBeard,啊,那么您的
.plist
不属于
根:控制盘
。然后尝试
sudo chown root:wheel/Library/LaunchAgents/com.username.scriptname.plist
。为什么即使它包含正确的答案也会被否决?在该答案包含相同内容12小时后,又添加了一个答案!请注意,这个问题是由于这个答案而改变的,最后一步(chowning the plist)在评论中有所说明。为什么不点击Apple菜单、系统首选项、用户,然后选择您的用户名并将您的脚本添加到登录项中呢?我基本上想编写一个shell脚本来实现这一点!用类似的方法<代码>osascript-e'告诉应用程序“系统事件”,使登录项以属性结尾{path:“/Users/FreddyFrog/SomethingPythony”}”谢谢!它可以工作,但脚本会在文本编辑器中打开,而不是使其可执行。脚本是否有一个shebang作为Python解释器路径的第一行?你能给我看剧本吗?如果没有,做一个非常简单的测试——例如,让它在你的桌面上创建一个空文件或目录,这样你就可以看到它是否运行,或者让它运行
osascript-e'beep 3'
->grep com.username.scriptname /var/log/syslog
grep: /var/log/syslog: No such file or directory

->launchctl list com.username.scriptname
{
    "StandardOutPath" = "/tmp/com.username.scriptname.out";
    "LimitLoadToSessionType" = "Aqua";
    "StandardErrorPath" = "/tmp/com.username.scriptname.err";
    "Label" = "com.username.scriptname";
    "TimeOut" = 30;
    "OnDemand" = true;
    "LastExitStatus" = 19968;
    "Program" = "/Users/username/scriptname.sh";
};