2013-05-05 5 views
5

Ho diversi thread ognuno dei quali sta cambiando le directory di lavoro e occasionalmente ne crea di nuovi in ​​directory di lavoro specifiche, copia/sposta file ecc in queste directory. Pensate ad es .:Che cos'è un file os.chdir e mkdir specifico per il thread in python?

def thread1: 
    while True: 
    os.chdir('dir') 
    os.mkdir('newdir') 
    os.system('mv *.png newdir/') 
    do something 

def thread2: 
    while True: 
    os.chdir('another-dir') 
    os.mkdir('another-newdir') 
    os.system('mv *.png another-newdir/') 
    do something 

Ho letto che chdir, funzioni mkdir non sono specifici di discussioni, ma globale. Qual è un modo per realizzare questo? Posso provare a utilizzare percorsi assoluti ma è quella la soluzione migliore?

+1

Un modo rapido per risolverlo è non chiamare mai '' os.chdir() ''. Nel tuo caso diventerebbe "os.mkdir ('dir/newdir'); os.system ('cd dir && mv * .png newdir /') ''. Si noti che il '' cd'' è all'interno del comando shell. –

+0

Un'altra soluzione, solo su Linux, è usare la funzione 'unshare (CLONE_FS)', ma ciò richiede sicuramente la scrittura C o l'uso di ctypes/cffi. –

risposta

5

La directory di lavoro è un'informazione del processo , quindi tutti i thread condividono la stessa directory di lavoro. È lavoro con percorsi assoluti se si desidera utilizzare più thread.

È possibile ottenere facilmente i percorsi assoluti utilizzando il modulo os.path.

Un'altra cosa che si può considerare è usare la libreria standard di python per fare la copia invece di chiamare processi esterni.

Vedi per esempio:

+0

Probabilmente non molto utile, ma esiste una soluzione su Linux (che non esiste su altri sistemi operativi, e non è esposto a Python AFAIK): fai '' man mkdirat'' per saperne di più. –

+0

@ArminRigo, [mkdirat] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/mkdir.html) è POSIX. – pilcrow

+0

@pilcrow: hai ragione. Inoltre, è stato aggiunto a Python 3.3 dove si può dire ad esempio 'os.open (..., dir_fd = fd)'. –

1

directory di lavoro corrente a livello di sistema operativo di solito è un processo specifico, non per thread. (Linux: vedi)

Le operazioni di file interno Python possono essere riscritte per lo più per utilizzare un os.path.join() ed evitare chdir().

Quando ciò non è possibile, ad es. per il codice immodificabile, per il tipo RExec di esecuzioni sandbox o così, è possibile fornire un modulo virtuale os, open ecc. che eseguono la regolazione del percorso dietro le quinte.

Per chiamare i programmi esterni, è possibile fornire un argomento cwd=... in chiamate secondarie e inopportune().