如何在群晖NAS任务计划程序中运行依赖第三方库的Python脚本
问题原因
- 相对路径导致文件写入位置错误/无权限:群晖任务计划程序执行脚本时的默认工作目录不是脚本所在目录,你用相对路径
log.txt时,程序会尝试将日志写入默认工作目录(通常是执行用户的home目录或/root),要么你找不到该路径下的文件,要么执行用户对该路径没有写入权限,直接写入失败。 - Python解释器不匹配:群晖系统内置多个Python版本,你在终端用
sudo调用的是你自行安装的py3k套件对应的Python,但任务计划中如果直接写python3调用的可能是系统默认的Python版本,二者的模块路径、权限不一致,如果后续用到pandas等第三方库会直接报导入失败。 - 执行用户权限不足:如果任务计划指定的执行用户对你要写入文件的目录没有读写权限,也会导致文件生成失败。
- 可选注意项:你额外安装的第三方
DateTime库和Python标准库的小写datetime命名接近,后续可能出现导入冲突。
解决方案
- 脚本内所有路径改为绝对路径
把你脚本中log.txt改为你实际要存放的绝对路径,比如要和第一个脚本一样存在/volume1/homes/admin/python/下,就修改对应代码:
write_file('/volume1/homes/admin/python/log.txt' , print_time())
如果后续要用到你安装的第三方库,可以在脚本开头添加模块搜索路径,避免导入失败:
import sys sys.path.append('/volume1/@appstore/py3k/usr/local/lib/python3.5/site-packages') from datetime import datetime import os # 其余代码不变
- 任务计划中写全Python解释器绝对路径
你安装了pip、第三方库的Python解释器路径为/var/packages/py3k/target/usr/local/bin/python3,在任务计划的运行命令中直接使用全路径调用,假设你的脚本存放在/volume1/homes/admin/python/test.py,命令写为:
/var/packages/py3k/target/usr/local/bin/python3 /volume1/homes/admin/python/test.py
如果需要排查报错,可以在命令末尾加上日志重定向,把运行时的所有输出和报错都存到指定文件:
/var/packages/py3k/target/usr/local/bin/python3 /volume1/homes/admin/python/test.py >> /volume1/homes/admin/python/run.log 2>&1
确认执行用户权限
任务计划的执行用户选择root,或者给你要写入文件的目录(比如/volume1/homes/admin/python/)开放对应执行用户的读写权限。可选冲突处理
如果后续出现datetime导入冲突,可以执行以下命令卸载第三方DateTime库,使用系统自带的标准库即可:
/var/packages/py3k/target/usr/local/bin/python3 -m pip uninstall DateTime
内容的提问来源于stack exchange,提问作者yts61
相关产品推荐
相关产品推荐

