ฉันจะระบุไดเรกทอรีทำงานสำหรับป๊อป


187

มีวิธีการระบุไดเรกทอรีทำงานของคำสั่งใน Python subprocess.Popen()หรือไม่?

ตัวอย่างเช่น:

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

สคริปต์ Python ของฉันอยู่ใน C:\programs\python

เป็นไปได้ที่จะทำงานC:\mytool\tool.exeในไดเรกทอรีD:\test\localหรือไม่

ฉันจะตั้งค่าไดเรกทอรีการทำงานสำหรับกระบวนการย่อยได้อย่างไร


2
โปรดทราบว่า subprocess.call เป็นเพียง wrapper ที่บางกว่า subprocess.Popen และ wrapper นี้เกี่ยวข้องกับอาร์กิวเมนต์ทั้งหมดของ Popen เช่นกันอย่างน้อยก็เท่าที่ฉันจำได้ :) ในกรณีง่าย ๆ ควรติด subprocess.call
shabunc

คำตอบ:


270

subprocess.Popen รับcwdอาร์กิวเมนต์เพื่อตั้งค่าไดเรกทอรีการทำงานปัจจุบัน คุณจะต้องหลบหนีแบ็กสแลชของคุณ ( 'd:\\test\\local') หรือใช้r'd:\test\local'เพื่อให้แบ็กสแลชไม่ถูกตีความว่าเป็นลำดับการหลบหลีกโดย Python วิธีการที่คุณมีมันเขียนที่ส่วนหนึ่งจะถูกแปลไป\ttab

ดังนั้นบรรทัดใหม่ของคุณควรมีลักษณะดังนี้:

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

ในการใช้พา ธ สคริปต์ Python ของคุณเป็น cwd import osและกำหนด cwd โดยใช้สิ่งนี้:

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

2
หากมีผลกระทบอะไรจะเพิ่ม Shell = True ให้กับข้อโต้แย้งที่มีต่อการตั้งค่า cwd ด้วยเช่นกัน
T. Stone

3
@T Stone: สำหรับปฏิบัติการแบบสแตนด์อโลนมันไม่ควรเปลี่ยนแปลงอะไรนอกจากว่า exe ขึ้นอยู่กับตัวแปรสภาพแวดล้อมบางอย่างในเชลล์อาจจะ แต่ด้วยshell=Falseคุณจะไม่สามารถใช้เปลือก builtin เช่นcd: เช่นลองนี้บน Linux และเปลือกหอยทั้งสองวิธี:subprocess.Popen("cd /tmp; pwd")
มาร์ค Rushakoff

12
อย่างน้อยใน python 3 คุณไม่จำเป็นต้องใช้แบ็กสแลชแม้ในเครื่องที่ใช้ windows ฉันเพิ่งทำsubprocess.call(["C:/Users/Bob/Some.exe"], cwd="C:/Users/Jane/")และใช้งานได้ดี
mgrandi

7
ไดเร็กทอรีการทำงานต้องเป็นพา ธ สัมบูรณ์หรือไม่?
DXsmiley

10
มันยังทำงานได้สำหรับ subprocess.check_output () ขอบคุณมาก!
ซามูเอล Dauzon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.