You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确设置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 06:01:43