【发布时间】: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