9

我有一个 Python 二进制文件,它使用 SQLite 作为其后端数据库。SQLite 的文档和代码建议设置以下 3 个环境变量中的任何一个都应该有效:

export TMP=/var/tmp/sqlite/
export TEMP=/var/tmp/sqlite/
export TEMPDIR=/var/tmp/sqlite/

如果我在启动 Python 二进制文件之前在我的 bash 脚本中导出上述变量,这将无济于事。

putenv()我尝试的另一个选项是通过设置调用os.environ

os.environ['TMP'] = /var/tmp/sqlite/
os.environ['TEMP'] = /var/tmp/sqlite/
os.environ['TEMPDIR'] = /var/tmp/sqlite/

以上选项都没有帮助说服 SQLite/var/tmp/sqlite用作其临时存储目录。唯一有效的选项(SQLite 的文档说已弃用)是设置temp_store_directorypragma 语句:

PRAGMA temp_store_directory = '/egnyte/.work/sqlite_temp'

由于使用 pragma 语句不是我想做的选择,还有其他技巧吗?

4

2 回答 2

9

您所指的环境变量确实是 sqlite 寻找的,但在 Windows 中,而不是在 UNIX 中。

在 Unix 中,您需要设置的环境变量TMPDIR如源代码所示:

static const char *unixTempFileDir(void){
  static const char *azDirs[] = {
     0,
     0,
     "/var/tmp",
     "/usr/tmp",
     "/tmp",
     0        /* List terminator */
  };
  unsigned int i;
  struct stat buf;
  const char *zDir = 0;

  azDirs[0] = sqlite3_temp_directory;
  if( !azDirs[1] ) azDirs[1] = getenv("TMPDIR");
  for(i=0; i<sizeof(azDirs)/sizeof(azDirs[0]); zDir=azDirs[i++]){
    if( zDir==0 ) continue;
    if( osStat(zDir, &buf) ) continue;
    if( !S_ISDIR(buf.st_mode) ) continue;
    if( osAccess(zDir, 07) ) continue;
    break;
  }
  return zDir;
}
于 2012-05-01T09:41:47.493 回答
4

对于 3.8.1+ 版本(2013 年 10 月发布),使用新的SQLITE_TMPDIR环境变量而不是更干净TMPDIR,因为后者被 SQLite 以外的 Unix 软件使用。

发行说明

现在可以使用 SQLITE_TMPDIR 环境变量设置用于在 unix 上保存临时文件的目录,该环境变量优先于 TMPDIR 环境变量。但是, sqlite3_temp_directory 全局变量的优先级仍然高于两个环境变量。

于 2016-08-08T10:31:05.377 回答