【问题标题】:python unable to write to sqlite3 db from command linepython无法从命令行写入sqlite3 db
【发布时间】:2014-01-20 02:45:35
【问题描述】:

我有一个 python 脚本,它从 ds18b20 传感器读取温度并将其写入位于同一目录中的 sqlite3 db。写入数据库的代码部分如下所示:

def write_DB(devID, devNAME, temp):
    conn = sqlite3.connect('templog.db')
    curs = conn.cursor()

    curs.execute("INSERT INTO temps values((?),(?), datetime('now'), (?))", (devID, devNAME, temp))

    conn.commit()

从 idle3 运行时运行良好,但从命令行或 cron 运行时,输出如下:

 ~/python/HydroMon $ /usr/bin/python /home/pi/python/HydroMon/ds18b20_scanner.py
Traceback (most recent call last):
 File "/home/pi/python/HydroMon/ds18b20_scanner.py", line 102, in <module>
  scan_dev()
 File "/home/pi/python/HydroMon/ds18b20_scanner.py", line 69, in scan_dev
  write_DB(file, dev, temp)
 File "/home/pi/python/HydroMon/ds18b20_scanner.py", line 49, in write_DB
  curs.execute("INSERT INTO temps values((?),(?), datetime('now'), (?))", (devID, devNAME, temp))
sqlite3.OperationalError: unable to open database file

知道为什么这不会从命令行运行吗?所有权限都是正确的。

编辑:我将此添加到 write_db()

global basedir
db_file = basedir + '/templog.db'
conn = sqlite3.connect(db_file)

这不再产生错误。这是用于打开和读取 conf 文件的 basedir 分配函数,现在会导致错误。我尝试过使用 python 和 python3。

#Configuratio Directory
fullpath = sys.argv[0]
basedir = os.path.dirname(fullpath)
confdir = basedir + "/conf"

#Variable to check if scan was good
reading = 0
def get_dev_name(devID):
    global confdir
    devName = 'NONE'
    #open conf file
    conf = confdir + '/devname.conf'
    print(conf)
    cfile = open(conf,mode='r')

从 idle3 运行时,结果是: /home/pi/python/HydroMon/conf/devname.conf

从命令行运行时:

~/python/HydroMon $ sudo python3 ds18b20_scanner.py 
/conf/devname.conf
Traceback (most recent call last):
 File "ds18b20_scanner.py", line 105, in <module>
  scan_dev()
 File "ds18b20_scanner.py", line 70, in scan_dev
  dev = get_dev_name(file)
 File "ds18b20_scanner.py", line 27, in get_dev_name
  cfile = open(conf,mode='r')
IOError: [Errno 2] No such file or directory: '/conf/devname.conf'

【问题讨论】:

标签: python command-line sqlite


【解决方案1】:

当您从命令行运行它时,尝试打印出sys.argv[0]。您可能会惊讶地发现它是 ds18b20_scanner.py,这使得 dirname 成为一个空字符串。

如果您尝试写入与脚本相同的位置,也许您想使用__file__ 而不是sys.argv[0]

【讨论】:

  • file 对我不起作用,但使用 fullpath = os.path.abspath(sys.argv[0]) basedir = os.path.dirname(fullpath) 确实诀窍。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-08
  • 1970-01-01
  • 1970-01-01
  • 2014-12-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多