Як я можу вказати робочий каталог для popen


187

Чи є спосіб вказати запущений каталог команд у Python's 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 - це лише тонка обгортка над subprocess.Popen, і ця обгортка також стосується всіх аргументів Popen, принаймні, наскільки я пам’ятаю :) У простих випадках краще дотримуватися subprocess.call
shabunc

Відповіді:


270

subprocess.Popen бере cwdаргумент для встановлення Поточного робочого каталогу; Ви також хочете уникнути косої риски ( 'd:\\test\\local') або використовувати r'd:\test\local'так, щоб кососугі риси не трактувалися Python як послідовності втечі. Як ви це написали, \tчастина буде переведена на а tab.

Отже, ваш новий рядок повинен виглядати так:

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?
Т. Стоун

3
@T. Стоун: Для автономного виконуваного файлу він не повинен нічого змінювати, якщо, можливо, exe не залежить від деяких змінних середовищ в оболонці. Але, shell=Falseви не можете використовувати вбудовану оболонку типу cd: тобто спробуйте це в Linux з оболонкою обома способами:subprocess.Popen("cd /tmp; pwd")
Марк Рушакофф

12
Принаймні, у python 3 вам не доведеться використовувати нахили, навіть коли на машині Windows, я щойно це зробив, subprocess.call(["C:/Users/Bob/Some.exe"], cwd="C:/Users/Jane/")і він працює чудово
mgrandi

7
Чи повинен робочий каталог бути абсолютним шляхом?
DXsmiley

10
Він також працює для subprocess.check_output (). Дякую !
Самуель Доусон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.