2012-01-09 12 views
7

Ho bisogno di una directory temporanea, ma voglio il pieno controllo sulla sua creazione e cancellazione.La directory temporanea rimane tra le esecuzioni del programma

Userò questa directory per posizionare i repository git che voglio monitorare per nuovi commit, quindi ho bisogno di memorizzarli da qualche parte in modo permanente.

Pertanto, desidero evitare la dir /tmp, poiché può essere cancellata dall'utente (?). Qual è la migliore pratica per questo?

risposta

1

http://pypi.python.org/pypi/appdirs è un modulo Python che offre una funzione multipiattaforma user_cache_dir.

+0

Wow, grazie. Immagino che questa sia la strada da percorrere. Mi sto solo chiedendo 'user_cache_dir' vs' site_data_dir', che è più adatto per il mio caso. – umpirsky

8

tempfile.mkdtemp creerà una dir temp per te e restituirà il suo nome. Lo creerà in /tmp per impostazione predefinita (su sistemi simil-Unix), ma "nel modo più sicuro possibile" e con autorizzazioni di lettura/scrittura/elenco solo per l'id utente del chiamante.

>>> d = tempfile.mktemp() 
>>> with open(os.path.join(d, "secret")) as output: 
...  output.write("Ha, you can't read this!") 

(Btw., Su un sistema Unix/Linux con le impostazioni predefinite, gli utenti possono non solo modificare o rimuovere i file di ogni altri da /tmp.)

+0

Hehum, stavo guardando questo. Quindi, non posso contare che una volta creato, il tempdir sarà sempre lì? Inoltre, ho bisogno di ricordare una volta creato il percorso dir e usarlo su ogni esecuzione di app, giusto? Ti consiglio di creare un tmpdir di primo livello per tutti i miei sottodirectory (git repos) o per separarli ognuno nel proprio tempdir? Grazie. – umpirsky

+0

@umpirsky: vuoi che la directory temp persista attraverso le esecuzioni del programma? –

+0

Molto probabilmente creerà una directory in/tmp che è l'impostazione predefinita per ['tempfile.tempdir'] (http://docs.python.org/library/tempfile.html#tempfile.tempdir). – sth

8

direi che la migliore pratica è utilizzare tempfile.mkdtemp.

Se non si wan per usare /tmp allora, è possibile usufruire del parametro prefix:

import tempfile 
tempfile.mkdtemp(prefix=<your_preferred_directory>) 

Edit: Per quanto riguarda ciò che è la directory più appropriata per sotre configurazione dell'applicazione, i dati della cache, ecc Se stai usando Linux, dai un'occhiata allo XDG Base Directory Specification.

0

Di solito i programmi utilizzano una directory ~/.progname per archiviare dati che dovrebbero essere persistenti ma che dovrebbero rimanere "fuori mano" dell'utente.

2

Se è veramente temporaneo, seguire il consiglio di larmans e utilizzare mkdtemp.

Se si tratta di una sorta di cache semi-permanente che deve sopravvivere ai riavvii, è necessario utilizzare la directory dell'applicazione locale, come definita dal sistema operativo (% APPDATA%, ~/.local/etc); alcuni toolkit (ad esempio Qt) forniscono funzioni per visualizzare tale cartella in modo multipiattaforma.

Edit: da Wikipedia:

  • HOME (Unix-like) e USERPROFILE (Microsoft Windows) - indicare dove directory home di un utente si trova nel file system.
  • HOME/{. AppName} (Unix-like) e APPDATA {DeveloperName \ AppName} (Microsoft Windows) - per la memorizzazione delle impostazioni dell'applicazione. Molti aperti programmi sorgente utilizzano in modo non corretto USERPROFILE per le impostazioni delle applicazioni in Windows - USERPROFILE deve essere utilizzato solo in finestre che permettono all'utente di scegliere tra i percorsi come Documenti/Immagini/Download/Musica, a fini programmatici utilizzare APPDATA (roaming), LOCALAPPDATA o PROGRAMDATA (condivisa tra gli utenti)

così si dovrebbe guardare in alto o os.environ['APPDATA']os.environ['HOME'], a seconda della piattaforma (vedi sys.platform) e quindi accodare il tuo nome dell'applicazione, e quindi è possibile memorizzare c'è tutto quello che vuoi.

mydir = os.path.join(".myAppName", "cache") 
homeVar = 'HOME' # default for all *nix variants 
if sys.platform == 'win32': 
    homeVar = 'APPDATA' 
mydir = os.path.join(os.environ[homeVar], mydir) 
0

Solo un però: Si consiglia di guardare in git commit hooks. In questo modo, invece di monitorare una directory tmp per nuovi commit (sembra strano: chi si impegna in una directory tmp con autorizzazioni limitate?) Il repository ti informa sui commit, o, più precisamente, esegue automaticamente uno script ogni volta che si verifica un commit.

+0

Sto costruendo una sorta di monitor Git, che notificherà i cambiamenti nel ramo principale. Sth come feed RSS githubs. Al fine di rilevare i cambiamenti, ho bisogno di recuperare il repository da qualche parte. Ecco perché ho bisogno di tmp dir. Thx, – umpirsky

+0

Non vorreste averlo in una directory permanente quindi, quindi non è necessario clonare l'intero repository ogni volta che si desidera verificare le modifiche? – a2800276

+0

Sì, sembra che abbia sbagliato la mia domanda, mi dispiace. – umpirsky

Problemi correlati