2013-05-05 8 views
5

Ich habe mehrere Threads, von denen jeder Arbeitsverzeichnis ändert und gelegentlich neue in bestimmten Arbeitsverzeichnissen erstellt, Kopieren/Verschieben von Dateien usw. in diesen Verzeichnissen. Denken Sie z .:Was ist ein Thread-spezifischer os.chdir und mkdir 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 

ich das Chdir gelesen haben, mkdir Funktionen sind nicht spezifisch für Fäden, sondern global. Was ist ein Weg, dies zu erreichen? Ich kann versuchen, absolute Pfade zu verwenden, aber ist das die beste Lösung?

+1

Ein schneller Weg, es zu lösen, ist, niemals 'os.chdir()' 'aufzurufen. In Ihrem Fall würde es "os.mkdir" ("dir/newdir") werden; os.system ('CD-Verzeichnis && mv * .png newdir /') ''. Beachten Sie, dass das '' cd'' innerhalb des Shell-Befehls ist. –

+0

Noch eine andere Lösung - nur unter Linux - ist die Verwendung der Funktion 'unshare (CLONE_FS)', aber das erfordert definitiv das Schreiben von C oder die Verwendung von ctypes/cffi. –

Antwort

5

Das Arbeitsverzeichnis ist eine Information des Prozesses , daher teilen alle Threads dasselbe Arbeitsverzeichnis. Sie müssen mit absoluten Pfaden arbeiten, wenn Sie mehrere Threads verwenden möchten.

Mit dem Modul os.path können Sie ganz einfach absolute Pfade erhalten.

Eine andere Sache, die Sie in Betracht ziehen können, ist Pythons Standard-Bibliothek zu verwenden, um das Kopieren statt externe Prozesse aufzurufen.

Siehe zum Beispiel:

+0

Wahrscheinlich nicht sehr nützlich, aber es gibt eine Lösung auf Linux (die auf anderen Betriebssystemen nicht existiert und nicht Python AFAIK ausgesetzt ist): Do '' man mkdirat'', um mehr zu erfahren. –

+0

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

+0

@pilcrow: Du hast Recht. Außerdem wurde es zu Python 3.3 hinzugefügt, wo Sie zum Beispiel 'os.open (..., dir_fd = fd)' sagen können. –

1

Das aktuelle Arbeitsverzeichnis auf OS-Ebene in der Regel ist prozessspezifisch, nicht pro Thread. (Linux: siehe unshare)

Python interne Dateioperationen können meistens neu geschrieben werden, um eine os.path.join() zu verwenden und chdir() zu vermeiden.

Wenn dies nicht möglich ist, z.B. für unveränderbaren Code, für RExec Art von Sandbox Ausführungen oder so, dann könnten Sie eine virtuelle os Modul, open Funktionen usw., die Pfad Anpassung hinter den Kulissen tun.

Zum Aufrufen von externen Programmen können Sie ein cwd=... Argument in subprocess.Popen() -Aufrufe und Freunde bereitstellen.