2012-05-01 89 views
7

我有一個使用SQLite作爲其後端數據庫的Python二進制文件。 SQLite的文檔和代碼提示設置任何以下3個環境變量應該工作:設置sqlite臨時存儲目錄

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

如果我出口上述變量在我的bash腳本就在我開始我的Python二進制,它並不能幫助。

另一種選擇我試圖通過設置os.environ調用putenv()

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 temp_store_directory = '/egnyte/.work/sqlite_temp' 

由於使用編譯語句沒有選擇,我想提出,有沒有其他的把戲?

回答

7

您所指的環境變量確實是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

對於3.8.1+版(2013年10月發佈),它的清潔使用新SQLITE_TMPDIR環境變量而不是TMPDIR,因爲後者被SQLite以外的Unix軟件使用。

release notes

用來保存在UNIX上的臨時文件的目錄現在可以使用SQLITE_TMPDIR環境變量,它優先於TMPDIR環境變量來設置。但是,sqlite3_temp_directory全局變量的優先級仍高於兩個環境變量。