Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-将SQlite3与Daemonize一起使用时未找到表错误_Python_Sqlite_Python Daemon - Fatal编程技术网

Python-将SQlite3与Daemonize一起使用时未找到表错误

Python-将SQlite3与Daemonize一起使用时未找到表错误,python,sqlite,python-daemon,Python,Sqlite,Python Daemon,我有一个访问SQlite数据库的slack机器人。当我在前台运行bot时,一切正常,但当我作为守护进程运行它时,它似乎连接到我的数据库,但在我运行的每个查询上都返回“table not found” 问题是,这在我的最新版本之前一直有效,我找不到有什么变化,所以我做了一个精简版本作为测试,但我仍然有同样的问题。见下文: import syslog import sqlite3 import os from daemonize import Daemonize from slackclient i

我有一个访问SQlite数据库的slack机器人。当我在前台运行bot时,一切正常,但当我作为守护进程运行它时,它似乎连接到我的数据库,但在我运行的每个查询上都返回“table not found”

问题是,这在我的最新版本之前一直有效,我找不到有什么变化,所以我做了一个精简版本作为测试,但我仍然有同样的问题。见下文:

import syslog
import sqlite3
import os
from daemonize import Daemonize
from slackclient import SlackClient
from qatoken import token

#Slack vars
nickname = "NetBot-QA"
dump = "#net-dump-qa"
channel = "#net-alerts-qa"
avatar = ":loader:"

#Daemonize vars
pid = "/tmp/netbot-qa.pid"
app = "net-bot-qa"
syslog.openlog('netbot', 0, syslog.LOG_LOCAL4 )

###################################################### MAIN
def main():

    sc = SlackClient(token)
    sc.api_call("chat.postMessage", username=nickname, channel=dump, text="{0}/net-alerts-test.db".format(os.path.dirname(__file__)), icon_emoji=avatar)

    try:
        conn = sqlite3.connect("{0}/net-alerts-test.db".format(os.path.dirname(__file__)))
        c = conn.cursor()
        c.execute("SELECT * from maint_calendar")
        sc.api_call("chat.postMessage", username=nickname, channel=dump, text="made it!", icon_emoji=avatar)
    except (SystemExit, KeyboardInterrupt):
        raise
    except Exception, e:
        sc.api_call("chat.postMessage", username=nickname, channel=dump, text="The bot crashed", icon_emoji=avatar)
        syslog.syslog("error: {0}".format(e))

########################################################################################
#main()
########################################################################################
#main()
daemon = Daemonize(app=app, pid=pid, action=main)
daemon.start()    
如果我运行main(),我会得到slack消息“makeit!”,但是如果我注释掉它并运行daemon.start(),我会得到“bot崩溃了”

当我输入cat/var/log/messages时,我看到的是:

Nov 16 09:47:37 server1 netbot: error: no such table: maint_calendar

[root@server1 net-alerts]# pwd
/opt/bots/net-alerts

[root@server1 net-alerts]# sqlite3 net-alerts-test.db
SQLite version 3.7.17 2013-05-20 00:56:22
sqlite> .schema
CREATE TABLE maint_calendar (start time, finish time, summary text, dc_tag text, provider text, CONSTRAINT start_sum PRIMARY KEY (start, summary));

我也尝试过使用db的静态路径来运行它,但是os.path.dirname在我使用的其他脚本中运行得非常好。我发现另一篇帖子说,您必须在守护进程上下文(main())中建立DB连接,但我从一开始就这样做了。我的想法快用完了。

在我看来,这句话:

conn = sqlite3.connect("{0}/net-alerts-test.db".format(os.path.dirname(__file__)))
实际上正在连接到两个不同的源,具体取决于您是daemonize还是只运行main()

只需将文件保存到全局变量中的db中,稍后使用。例如:

DB_PATH = "{0}/net-alerts-test.db".format(os.path.dirname(__file__))
...
def main():

    sc = SlackClient(token)
    sc.api_call("chat.postMessage", username=nickname, channel=dump, text="{0}/net-alerts-test.db".format(os.path.dirname(__file__)), icon_emoji=avatar)

    try:
        conn = sqlite3.connect(DB_PATH)

在我看来,这句话:

conn = sqlite3.connect("{0}/net-alerts-test.db".format(os.path.dirname(__file__)))
实际上正在连接到两个不同的源,具体取决于您是daemonize还是只运行main()

只需将文件保存到全局变量中的db中,稍后使用。例如:

DB_PATH = "{0}/net-alerts-test.db".format(os.path.dirname(__file__))
...
def main():

    sc = SlackClient(token)
    sc.api_call("chat.postMessage", username=nickname, channel=dump, text="{0}/net-alerts-test.db".format(os.path.dirname(__file__)), icon_emoji=avatar)

    try:
        conn = sqlite3.connect(DB_PATH)

我也有同样的问题。我已经硬编码的DB文件的完整路径,它的工作很好

示例:

dbconn = sqlite3.connect("/home/pi/db.db")
cur = dbconn.cursor()
cur.execute("INSERT INTO raw_data(id, packet, db_insert_time, sync) VALUES(NULL, ?, ?, ?)", ('Line', x, 'N'))

dbconn.commit()
print('DB Insert success!')

我也有同样的问题。我已经硬编码的DB文件的完整路径,它的工作很好

示例:

dbconn = sqlite3.connect("/home/pi/db.db")
cur = dbconn.cursor()
cur.execute("INSERT INTO raw_data(id, packet, db_insert_time, sync) VALUES(NULL, ?, ?, ?)", ('Line', x, 'N'))

dbconn.commit()
print('DB Insert success!')

试着放;首先,在SQL语句的末尾,请:)请将其打印到日志中:os.path.dirname(_文件__),这样您就可以查看它是否真的是相同的路径,即使它已被守护;在SQL语句的末尾,首先,请:)请将其打印到日志中:os.path.dirname(_文件__),以便您可以查看它是否真的是相同的路径,即使它已被守护。不起作用。我复制了你的代码,但我得到了相同的错误。第一条slack消息从main()的角度显示路径,并在这两种情况下显示正确的路径。我还尝试了一个静态路径,但它没有解决问题。另外,在调试时,您应该让异常引发,这样您就会看到完整的堆栈错误:exception,e:sc.api_call(“chat.postMessage”,username=昵称,channel=dump,text=“机器人崩溃”,icon_emoji=avatar)syslog.syslog(“错误:{0}.format(e))我能在Stderr中看到那个错误吗?由于这是作为一个守护进程运行的,我必须将输出发送到syslog,但即使在最后使用raise e,我也看不到任何更多的信息。是的,你不会看到它,除非你将stderr重定向到一个文件以查看整个错误的回溯。好的,我完全摆脱了os.path.dirname,现在它工作了。我不知道该怎么想,因为我甚至回到了我使用os.path.dirname的早期版本,我从备份中带来了我的旧DB,而bot仍然在同一个地方崩溃。所以这里的教训是:在使用Daemonize时要注意操作系统路径。你是对的,我投你一票,没用。我复制了你的代码,但我得到了相同的错误。第一条slack消息从main()的角度显示路径,并在这两种情况下显示正确的路径。我还尝试了一个静态路径,但它没有解决问题。另外,在调试时,您应该让异常引发,这样您就会看到完整的堆栈错误:exception,e:sc.api_call(“chat.postMessage”,username=昵称,channel=dump,text=“机器人崩溃”,icon_emoji=avatar)syslog.syslog(“错误:{0}.format(e))我能在Stderr中看到那个错误吗?由于这是作为一个守护进程运行的,我必须将输出发送到syslog,但即使在最后使用raise e,我也看不到任何更多的信息。是的,你不会看到它,除非你将stderr重定向到一个文件以查看整个错误的回溯。好的,我完全摆脱了os.path.dirname,现在它工作了。我不知道该怎么想,因为我甚至回到了我使用os.path.dirname的早期版本,我从备份中带来了我的旧DB,而bot仍然在同一个地方崩溃。所以这里的教训是:在使用Daemonize时要注意操作系统路径。你是对的,让我投你一票。