【问题标题】:Python script set to run on boot on Mac will not stay running设置为在 Mac 上启动时运行的 Python 脚本将不会继续运行
【发布时间】:2020-05-22 14:54:16
【问题描述】:

我有一个 Python 脚本,我想在启动时运行并在 Mac 上持续运行。我相信脚本正在执行,但它不会继续运行。
该设置是一个加载了 launchctl 的 plist 脚本,用于在启动时启动 Python 脚本 - 该脚本应始终保持运行。
(始终运行的)Python 脚本使用“调度”模块,该模块应在特定时间执行一个函数。
只要计算机处于开启状态,如何使此脚本运行?我可以看到它在某处运行吗?

具体来说:如果我只在终端中手动运行 Python 脚本,它会连续运行,并使用 schedule 模块在指定时间执行该函数。
如果我在启动时加载了 plist 脚本,那么 Python 脚本不会在指定时间执行该函数尽管如此,如果我将 Python 脚本更改为 ONE TIME 执行该函数,那么 plist 脚本将在启动时执行它。
[在下面的所有代码中,将“/path/to”更改为您的路径,以及您的 Mac 的用户名等(如果复制)。]
plist 脚本...

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs$
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>Run.The.FB.photoblast</string>
    <key>ProgramArguments</key>
    <array>
        <string>/path/to/python</string>
        <string>/path/to/python/script.py</string>
    </array>
    <key>StandardErrorPath</key>
    <string>/var/log/python_script.error</string>
    <key>KeepAlive</key>
    <true/>
</dict>
</plist>  

我把这个文件保存到

/Users/<user_name>/Library/LaunchAgents/FB_Photo_script_launcher.plist  

然后运行...

sudo launchctl load -w /Users/<user_name>/Library/LaunchAgents/FB_Photo_script_launcher.plist  

下面的 Python 脚本应在下午 1:00 将照片发布到 Facebook 页面。 (对于我的问题,Python 脚本可以做任何可测量的事情)。由于底部的“while True”,该脚本应始终运行并等待“schedule.run_pending()”触发。

import os
import time
import glob
import random
import facebook
import schedule

#wait 13 seconds to give the computer time to wake up
time.sleep(13)

def job():
  allphotofiles = glob.glob('/users/<user_name>/documents/fbcal/photos/*.jpg')
  one_photo = allphotofiles[random.randint(0, len(allphotofiles)-1)]
  #one_photo = glob.glob(one_random + '/*.jpg')[0]

  d = {
      'Calg Big': 'FACEBOOK_PAGE_TOKEN'}
  for i in d:
      graph = facebook.GraphAPI(access_token=d[i], version='3.1')
      graph.put_photo(image=open(one_photo, "rb"))
      print(i)


  os.rename(one_photo, '/users/<user_name>/documents/fbcal/used/'+one_photo[43:])

# job()

schedule.every().day.at("13:00").do(job())

while True:
  schedule.run_pending()
  time.sleep(1)  

感谢您阅读此问题。我的情况非常复杂。也许我需要另一种方法。我尝试使用 Automator 制作一个“应用程序”,但这有几个问题。 Automator 的 Python 版本无法导入 Facebook SDK,当我手动启动应用程序或启动时,我的电脑粉丝会全速运行。我不知道如何安排它,而且我已经在 Python 脚本中处理了安排部分。我只需要 Python 脚本在启动时运行并且永远不会停止运行。 是否有另一个计时器可以让我在不使用 Automator 的情况下每天在同一时间触发脚本?

【问题讨论】:

    标签: python scheduled-tasks schedule


    【解决方案1】:

    我刚刚删除了 Python 脚本中的调度,并设置了在调用脚本时触发的函数。然后创建了一个每天下午 2 点运行的 cron 作业。

    EDITOR=/usr/bin/nano crontab -e
    

    0 14 * * * 是每天下午 2 点

    0 14 * * * /anaconda3/bin/python /Users/mycomputername/Documents/FBcal/s2cheduler.py >> ~/cron.log 2>&1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-06
      相关资源
      最近更新 更多