Làm thế nào tôi có thể chỉ định thư mục làm việc cho popen


185

Có cách nào để xác định thư mục lệnh đang chạy trong Python subprocess.Popen()không?

Ví dụ:

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

Tập lệnh Python của tôi nằm ở C:\programs\python

Có thể chạy C:\mytool\tool.exetrong thư mục D:\test\local?

Làm cách nào để đặt thư mục làm việc cho quy trình phụ?


2
ghi nhớ rằng subprocess.call chỉ là một wrapper mỏng trên subprocess.Popen, và điều này giao dịch wrapper với tất cả các đối số của Popen là tốt, ít nhất là như xa như tôi nhớ :) Trong trường hợp đơn giản, thanh tốt hơn để subprocess.call
shabunc

Câu trả lời:


268

subprocess.Popen lấy một cwdđối số để đặt Thư mục làm việc hiện tại; bạn cũng sẽ muốn thoát dấu gạch chéo ngược ( 'd:\\test\\local') hoặc sử dụng r'd:\test\local'để dấu gạch chéo ngược không được hiểu là chuỗi thoát của Python. Cách bạn viết nó, \tphần sẽ được dịch sang a tab.

Vì vậy, dòng mới của bạn sẽ trông như:

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

Để sử dụng đường dẫn tập lệnh Python của bạn dưới dạng cwd import osvà xác định cwd bằng cách này:

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

2
Hiệu ứng nào, nếu có, sẽ thêm Shell = True cho các đối số có trên cwd không?
T. Stone

3
@T. Stone: Đối với một thực thi độc lập, nó không nên thay đổi bất cứ điều gì, trừ khi exe phụ thuộc vào một số biến môi trường trong shell, có thể. Nhưng, với shell=False, bạn không thể sử dụng một shell dựng sẵn như cd: tức là thử cái này trên Linux bằng cả hai cách:subprocess.Popen("cd /tmp; pwd")
Mark Rushakoff

12
Ít nhất trong python 3, bạn không phải sử dụng dấu gạch chéo ngược ngay cả khi trên máy windows, tôi đã làm subprocess.call(["C:/Users/Bob/Some.exe"], cwd="C:/Users/Jane/")và nó hoạt động tốt
mgrandi

7
Có phải thư mục làm việc phải là một đường dẫn tuyệt đối?
DXsmiley

10
Nó cũng hoạt động cho sub process.checkDefput (). Cảm ơn !
Samuel Dauzon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.