Popen için çalışma dizinini nasıl belirtebilirim


187

Python'larda komutun çalışan dizinini belirtmenin bir yolu var subprocess.Popen()mı?

Örneğin:

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

Python betiğim C:\programs\python

Is çalıştırmak mümkündür C:\mytool\tool.exedizinde D:\test\local?

Bir alt işlem için çalışma dizinini nasıl ayarlarım?


2
Unutmayın, subprocess.call sadece subprocess üzerinde ince bir sargıdır.Popen ve bu sarıcı, en azından hatırladığım kadarıyla, Popen'in tüm argümanlarıyla da ilgilenir :) Basit durumlarda, subprocess.call'a daha iyi yapışır
shabunc

Yanıtlar:


270

subprocess.Popen cwdGeçerli Çalışma Dizini'ni ayarlamak için bir argüman alır ; ayrıca ters eğik çizgilerinizden ( 'd:\\test\\local') kaçmak veya r'd:\test\local'ters eğik çizgilerin Python tarafından kaçış dizileri olarak yorumlanmaması için kullanmak istersiniz . Yazma şekliniz, \tbölüm a tab.

Yani, yeni hattınız şöyle görünmelidir:

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

Python kod yolunuzu import oscwd olarak kullanmak ve bunu kullanarak cwd'yi tanımlamak için:

os.path.dirname(os.path.realpath(__file__)) 

2
Varsa, argümanlara Shell = True eklenmesi de cwd'nin ayarlanmasındaki etkisi nedir?
T. Stone

3
@ T. Taş: Bağımsız bir yürütülebilir dosya için, exe belki de kabuktaki bazı ortam değişkenlerine bağlı olmadığı sürece hiçbir şeyi değiştirmemelidir. Ancak, shell=Falsegibi bir kabuk yerleşik kullanamazsınız cd: yani, Linux'ta kabuk ile her iki şekilde de deneyin:subprocess.Popen("cd /tmp; pwd")
Mark Rushakoff

12
En azından python 3'te, bir windows makinesinde bile ters eğik çizgiler kullanmak zorunda değilsiniz, ben sadece yaptım subprocess.call(["C:/Users/Bob/Some.exe"], cwd="C:/Users/Jane/")ve iyi çalışıyor
mgrandi

7
Çalışma dizini mutlak bir yol olmalı mı?
DXsmiley

10
Ayrıca subprocess.check_output () için de çalışır. Teşekkürler !
Samuel Dauzon
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.