2012-05-01 11 views
7

Mam plik binarny w języku Python, który używa bazy danych SQLite jako bazy danych zaplecza. Dokumentacja SQLite oraz kod sugeruje, że ustawienie dowolnego z 3 następujących zmiennych środowiskowych powinno działać:Ustawianie katalogu magazynu sqlite temp

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

Gdybym wyeksportować powyższych zmiennych w moim skrypcie bash tuż przed zacznę Pythona binarne, to nie pomaga.

Inną opcją Próbowałem dzwoni putenv() ustawiając os.environ:

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

Żaden z powyższych opcji pomógł przekonać SQLite używać /var/tmp/sqlite jako katalogu przechowywania w temp. Jedyną opcją, która pracowała - który dokumentacja SQLite mówi jest przestarzała - wyznacza oświadczenie temp_store_directory Pragma:

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

Ponieważ za pomocą instrukcji PRAGMA nie jest wybór chciałbym zrobić, jest jakiś inny trik?

Odpowiedz

7

Zmienne środowiskowe, do których się odnosisz, są rzeczywiście tym, czego szuka sqlite, ale w systemie Windows, a nie w systemie UNIX.

W Unix, zmienna środowiskowa trzeba ustawić to TMPDIR jak pokazano w źródłach:

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

Dla wersji 3.8.1+ (Wydany dnia October 2013), jest to odkurzacz do korzystania z nowej zmiennej środowiskowej SQLITE_TMPDIR zamiast TMPDIR, ponieważ ten ostatni jest używany przez oprogramowanie uniksowe inne niż SQLite.

Z release notes:

Katalog używany do przechowywania plików tymczasowych w systemie UNIX można teraz ustawić za pomocą zmiennej środowiskowej SQLITE_TMPDIR, która ma pierwszeństwo przed zmiennej środowiskowej TMPDIR. Jednak zmienna globalna sqlite3_temp_directory ma jeszcze wyższy priorytet niż obie zmienne środowiskowe.