0

我有一个连接到 sqlite 数据库的 vanilla 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().

4

1 回答 1

2

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

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

现在一切正常。

于 2014-11-11T11:39:46.817 回答