2013-05-05 3 views
5

私はそれぞれ作業ディレクトリを変更していて、特定の作業ディレクトリに新しいディレクトリを作成したり、これらのディレクトリのファイルをコピー/移動したりするスレッドをいくつか持っています。例えば考えなさい:スレッド固有のos.chdirとmkdirとは何ですか?

私はそれにchdirを読んだ
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 

、MKDIR関数は、スレッドが、グローバルに固有のものではありません。これを達成する方法は何ですか?私は絶対パスを使用しようとすることができますが、それは最善の解決策ですか?

+1

すぐに解決できるのは、 '' os.chdir() ''を決して呼び出さないことです。あなたの場合は '' os.mkdir( 'dir/newdir')になります。 os.system( 'cd dir && mv * .png newdir /') ''。 '' cd''はシェルコマンドの中にあることに注意してください。 –

+0

もう一つの解決策は、Linuxのみで 'unshare(CLONE_FS)'関数を使うことですが、Cを書くかctypes/cffiを使う必要があります。 –

答えて

5

作業ディレクトリはプロセスの情報であるため、すべてのスレッドは同じ作業ディレクトリを共有します。 は、複数のスレッドを使用する場合は絶対パスで動作する必要があります。

os.pathモジュールを使用すると、絶対パスを簡単に取得できます。

他にも、外部プロセスを呼び出す代わりにpythonの標準ライブラリを使ってコピーを行うことが考えられます。

は、例えば参照:

+0

おそらくそれほど有用ではないかもしれませんが、Linux(他のOSには存在せず、Python AFAIKには公開されていません)に関する解決策があります。詳細は "man mkdirat"を参照してください。 –

+0

@ArminRigo、[mkdirat](http://pubs.opengroup.org/onlinepubs/9699919799/functions/mkdir.html)はPOSIXです。 – pilcrow

+0

@pilcrow:そうです。また、Python 3.3に追加されました。たとえば、 'os.open(...、dir_fd = fd)'と言うことができます。 –

1

OSレベルでの現在の作業ディレクトリは、通常はスレッドごとに、プロセス固有のものです。 (Linux:unshareを参照)

Pythonの内部ファイル操作は、ほとんどがos.path.join()を使用し、chdir()を避けるために書き直すことができます。これが不可能な場合、例えば、次のようになります。変更不可能なコードの場合はRExecのサンドボックスの実行などのために、仮想のosモジュール、openの機能などを提供することができます。

外部プログラムを呼び出す場合は、subprocess.Popen()呼び出しとフレンドにcwd=...引数を指定できます。

関連する問題