【问题标题】:Python script runs in bash, but not in cron?Python 脚本在 bash 中运行,但不在 cron 中?
【发布时间】:2017-09-03 09:45:23
【问题描述】:

我编写了一个 Python 脚本,该脚本可以访问 reddit(使用 PRAW),访问特定的 subreddit,并使用 youtube-dl 从 Youtube 下载播客的剧集。我将脚本放在我的 /bin 文件夹中,所以我可以从 bash 的任何地方运行它。问题是它在 bash 中运行良好,但在 cron 中根本不行。我在 cron 中是这样设置的:

0 */1 * * * PKA.py

这是 cron 放入 /var/mail 的堆栈跟踪的副本:

Traceback (most recent call last):
     File "/bin/PKA.py", line 48, in <module>
    call(myCall)
  File "/usr/lib/python2.7/subprocess.py", line 522, in call
    return Popen(*popenargs, **kwargs).wait()
  File "/usr/lib/python2.7/subprocess.py", line 710, in __init__
    errread, errwrite)
  File "/usr/lib/python2.7/subprocess.py", line 1335, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

崩溃发生在系统调用时。它清楚地给出了错误“没有这样的文件或目录”,但所有目录都是正确的。我只使用绝对路径,所以这应该不是问题。我很难找出问题所在,如果你们能提供任何帮助,我将不胜感激。这是完整的脚本:

#!/usr/bin/env python
import praw
import os
from subprocess import call

#Directories
PKA_DIR = '/home/chris/Storage/750g/PKA/'
PKA_DOWNLOADED = '/home/chris/Storage/750g/PKA/pka-downloaded'
PKN_DIR = '/home/chris/Storage/750g/PKN/'
PKN_DOWNLOADED = '/home/chris/Storage/750g/PKN/pkn-downloaded'

#Create the reddit instance
reddit = praw.Reddit(Deleted for privacy)
subreddit = reddit.subreddit(Deleted Subreddit Name)

for submission in subreddit.new(limit=5):
    isDownloaded = False
    with open(PKN_DOWNLOADED, 'r') as downloaded:
        for line in downloaded:
            if submission.url in line:
                isDownloaded = True
            if line in submission.url:
                isDownloaded = True
        if isDownloaded == False:
            title, episode = submission.title.split()
            if title == 'PKN':
                myTitle = 'PKN #%s'%(episode) + '.%(ext)s'
                myCall = ['youtube-dl', '-f ' 'bestvideo[ext=mp4]+bestaudio[ext=m4a]', '-o' '%s%s'%(PKN_DIR,myTitle), submission.url]
                call(myCall)
                with open(PKN_DOWNLOADED, 'a') as writeOut:
                    writeOut.write(submission.url + '\n')
    isDownloaded = False
    with open(PKA_DOWNLOADED, 'r') as downloaded:
        for line in downloaded:
            if submission.url in line:
                isDownloaded = True
            if line in submission.url:
                isDownloaded = True
        if isDownloaded == False:
            title, episode = submission.title.split()
            if title == 'PKA':
                myTitle = 'PKA #%s - '%(episode) + '%(title)s.%(ext)s'
                myCall = ['youtube-dl', '-f ' 'bestvideo[ext=mp4]+bestaudio[ext=m4a]', '-o' '%s%s'%(PKA_DIR,myTitle), submission.url]
                call(myCall)
                with open(PKA_DOWNLOADED, 'a') as writeOut:
                    writeOut.write(submission.url + '\n')

程序登录机器人帐户(我知道这不是必需的,我只是想尝试 PRAW 的全部功能),然后导航到 subreddit。它会考虑最近的 5 个帖子,并从中提取 youtube 链接。它根据先前下载的剧集的文本文件数据库检查链接。如果该剧集尚未下载,它会下载该剧集并将其添加到列表中。它将所有必要的参数放入一个列表中,并使用call 进行系统调用。我怀疑这个问题是由于权限引起的,但我的搜索告诉我 cron 以 root 身份运行作业。它下载到的文件夹 (`/home/chris/Storage/750g') 都在不同的驱动器上,所以我认为权限可能是个问题。

有什么建议吗?

【问题讨论】:

  • 您的youtube-dl 命令在哪里?使用which youtube-dl 来解决。
  • /usr/local/bin/youtube-dl 难道是因为 PKA.py 在不同的目录中? PKA.py 在 /bin/PKA.py

标签: python linux bash python-2.7 cron


【解决方案1】:

最简单的解决方案是使用youtube-dl 的完整绝对路径。在您的情况下,请使用 /usr/local/bin/youtube-dl 而不是 youtube-dl

原因:

当用户访问 shell 时,某些 Linux 发行版(如 Ubuntu)会更改原始的 PATH 变量以在 /usr/local/bin 中包含命令。但是,cron 将一组最小的环境变量传递给作业,并保留原始的 PATH[1]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-22
    • 2018-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-20
    • 2019-07-14
    相关资源
    最近更新 更多