如何正确设置os.path?systemd服务运行时路径异常问题
问题:Systemd服务运行Python脚本时数据库路径异常
问题现象
- Python脚本
pi-main.py与数据库文件pythontut.db处于同一目录,在Thonny中运行正常,但通过systemd服务实现开机自启时,抛出“无法打开数据库”错误。 - 当前路径设置代码:
dbname = 'pythontut.db' scriptdir = os.getcwd() db_path = os.path.join(scriptdir, dbname) print(db_path)
- Thonny运行时输出路径:
/home/pi/pi-project/pythontut.db - systemd服务运行时输出路径:
/pythontut.db
Systemd配置文件
[Unit] Description=Main Jobs Running After=graphical.target [Service] Type=simple User=pi ExecStart=/usr/bin/python /home/pi/pi-project/pi-main.py Restart=on-abort [Install] WantedBy=graphical.target
原因分析
os.getcwd()获取的是当前工作目录而非脚本所在目录:Thonny运行脚本时,默认工作目录是脚本所在路径;但systemd服务默认工作目录为根目录/,导致拼接后得到错误的数据库路径。
解决方案
方法1:通过脚本自身路径定位数据库
修改Python代码,利用__file__获取脚本绝对路径,再提取所在目录:
import os dbname = 'pythontut.db' # 获取脚本所在目录的绝对路径 scriptdir = os.path.dirname(os.path.abspath(__file__)) db_path = os.path.join(scriptdir, dbname) print(db_path)
该方法不受工作目录影响,无论从哪个路径启动脚本,都能正确定位同目录下的数据库文件。
方法2:在systemd配置中指定工作目录
修改systemd服务文件,在[Service]段添加WorkingDirectory字段,指定脚本所在目录:
[Service] Type=simple User=pi WorkingDirectory=/home/pi/pi-project ExecStart=/usr/bin/python pi-main.py Restart=on-abort
设置后systemd会切换到指定目录运行脚本,原路径代码可保持不变。
权限排查(可选)
若路径修正后仍报错,检查数据库文件权限:
- 确保
pi用户拥有读写权限:
chown pi:pi /home/pi/pi-project/pythontut.db chmod 644 /home/pi/pi-project/pythontut.db
内容的提问来源于stack exchange,提问作者Sarath kumar
相关产品推荐
相关产品推荐

