我有一个用python编写的报警脚本,它从sqlite数据库中收集报警。
如果我执行脚本:python /home/pi/VRobot/alarm.V2.py一切正常。
当我将它放在/ etc / profile中执行它并在启动时运行它时会出现以下错误。
sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such table: reminders [SQL: u'SELECT reminders.id AS reminders_id, reminders.activity AS reminders_activity, reminders.time AS reminders_time, reminders.day AS reminders_day, reminders.song AS reminders_song, reminders.timeofday AS reminders_timeofday \nFROM reminders'] (Background on this error at: http://sqlalche.me/e/e3q8)
/ etc / profile脚本如下所示:
PS1='# '
else
PS1='$ '
fi
fi
fi
if [ -d /etc/profile.d ]; then
for i in /etc/profile.d/*.sh; do
if [ -r $i ]; then
. $i
fi
done
unset i
fi
amixer set 'PCM' 100%
python /home/pi/VRobot/alarm.V2.py &
为什么脚本在正常运行时工作正常但在启动时执行的任何想法都没有?
我这样做:
engine = create_engine('sqlite:///foo.db', echo=True)
所以我使用相对路径连接数据库。
答案 0 :(得分:1)
您正在使用相对路径连接到您的数据库;这使您依赖于当前的工作目录。从class A(object):
def circular_func(self):
from c import C
C.needed_function()
脚本运行时,当前工作目录会有所不同,此时您将连接到空数据库。
将当前工作目录更改为脚本(在shell代码中为/etc/profile
或在Python中为cd
),或使用绝对路径。
您可以生成来自os.chdir()
值的绝对路径:
__file__
然后使用import os.path
HERE = os.path.dirname(os.path.abspath(__file__))
database_path = os.path.join(HERE, 'foo.db')
database_uri = 'sqlite:///{}'.format(database_path)
进行连接。