我有一个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_directory
pragma语句:
PRAGMA temp_store_directory = '/egnyte/.work/sqlite_temp'
由于使用pragma语句不是我想做的选择,还有其他技巧吗?
答案 0 :(得分:8)
您所指的环境变量确实是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;
}
答案 1 :(得分:2)
对于版本3.8.1 +(2013年10月发布),使用新的SQLITE_TMPDIR
环境变量而不是TMPDIR
更清晰,因为后者由Unix软件使用而非SQLite的。
现在可以使用SQLITE_TMPDIR环境变量设置用于在unix上保存临时文件的目录,该环境变量优先于TMPDIR环境变量。但是,sqlite3_temp_directory全局变量的优先级仍然高于两个环境变量。