Bagaimana saya bisa menentukan direktori kerja untuk popen

187

Apakah ada cara untuk menentukan direktori perintah yang sedang berjalan di Python subprocess.Popen()?

Sebagai contoh:

Popen('c:\mytool\tool.exe', workingdir='d:\test\local')

Skrip Python saya terletak di C:\programs\python

Apakah mungkin dijalankan C:\mytool\tool.exedi direktori D:\test\local?

Bagaimana cara mengatur direktori kerja untuk sub-proses?

icn
sumber
2
perlu diingat bahwa subprocess.call hanyalah pembungkus tipis di atas subprocess.Popen, dan pembungkus ini berkaitan dengan semua argumen Popen juga, setidaknya sejauh yang saya ingat :) Dalam kasus sederhana, lebih baik tetap berpegang pada subprocess.call
shabunc

Jawaban:

270

subprocess.Popen mengambil cwdargumen untuk mengatur Direktori Kerja Saat Ini; Anda juga ingin melepaskan backslash Anda ( 'd:\\test\\local'), atau menggunakan r'd:\test\local'agar backslash tidak diartikan sebagai escape sequence oleh Python. Cara Anda menulisnya, \tbagian itu akan diterjemahkan ke a tab.

Jadi, baris baru Anda akan terlihat seperti:

subprocess.Popen(r'c:\mytool\tool.exe', cwd=r'd:\test\local')

Untuk menggunakan jalur skrip Python Anda sebagai cwd, import osdan tentukan cwd menggunakan ini:

os.path.dirname(os.path.realpath(__file__)) 
Mark Rushakoff
sumber
2
Apa efeknya, jika ada, yang akan menambahkan Shell = True ke argumen pada pengaturan cwd juga?
T. Stone
3
@T. Batu: Untuk eksekusi mandiri, itu tidak boleh mengubah apa pun, kecuali exe tergantung pada beberapa variabel lingkungan di shell, mungkin. Tapi, dengan shell=False, Anda tidak dapat menggunakan shell builtin seperti cd: yaitu, coba ini di Linux dengan shell kedua cara:subprocess.Popen("cd /tmp; pwd")
Mark Rushakoff
12
Dalam python 3 setidaknya, Anda tidak perlu menggunakan backslash bahkan ketika pada mesin windows, saya baru saja melakukannya subprocess.call(["C:/Users/Bob/Some.exe"], cwd="C:/Users/Jane/")dan berfungsi dengan baik
mgrandi
7
Apakah direktori kerja harus menjadi jalur absolut?
DXsmiley
10
Ini juga berfungsi untuk subprocess.check_output (). Terima kasih!
Samuel Dauzon