【问题标题】:Python daemon can see database, but complains that tables do not existPython守护进程可以看到数据库,但抱怨表不存在
【发布时间】:2014-11-09 18:23:04
【问题描述】:

我有一个连接到 sqlite 数据库的普通 python。

在我尝试将它作为守护进程运行之前,一切正常。这是我用来执行此操作的代码:

def start(self):
  if self.lockfile.is_locked():
    exit_with_code(7, self.pid_file)

  # If we're running in debug, run in the foreground, else daemonise
  if self.options['debug']:
    try:
      self.main()
    except KeyboardInterrupt:
      pass
    finally:
      self.close_gracefully()
  else:
    context = daemon.DaemonContext(
      files_preserve = [self.logger.socket(), self.lockfile]
    )

    context.signal_map = {
      signal.SIGTERM: self.close_gracefully
    }

    with context: self.main()

我可以使用python -m starter -debug 在前台运行它,一切都很好,我的应用程序写入数据库,但是当我关闭调试标志时,我在尝试写入时看到以下内容:

no such table: Frontends

我知道 frontends 表存在,因为我已经打开了数据库。我假设 python 正在查找数据库,否则会出现完全不同的错误消息。

我所有的文件都归 vagrant 所有,ls -l 显示如下:

-rwxrwxrwx 1 vagrant vagrant 9216 Nov  9 18:09 development.sqlite

有人有什么建议吗?

更新

根据要求,这是我的数据库的代码

import os
import sqlite3

class Database(object):

    def __init__(self, db_file='/vagrant/my_daemon/db/development.sqlite'):

        self.db = sqlite3.connect(db_file)

        if os.path.exists(db_file):
            print "db exists"

当我运行它时,它会打印“db exists”。我在 starter.py 中调用Database() 来实例化数据库。

【问题讨论】:

  • 您的假设很可能是错误的。显示尝试打开数据库的代码。
  • @CL 我更新了我的答案。
  • 这两个文件名哪个是正确的?
  • @CL 正确的文件名是 development.sqlite,我更新了问题
  • 我认为这可能是 vagrant/puppet 的问题,因为我在 syslog 中找到以下内容:Nov 9 20:44:26 puppet-agent[1402]: Did not receive certificate,并且我开始认为我的包无法正确安装。我要一个全新的虚拟机。

标签: python sqlite python-daemon


【解决方案1】:

当您进行守护程序时,Python 守护程序会关闭所有打开的文件描述符(stdin、stout 和 stderr 除外)。

我花了很长时间试图找出保持打开哪些文件以防止我的数据库无法访问,最后我发现在守护程序上下文中初始化数据库比在外部初始化数据库更容易。这样我就不用担心哪些文件应该保持打开状态。

现在一切正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    相关资源
    最近更新 更多