Как я могу указать рабочий каталог для popen


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 - это просто тонкая оболочка над subprocess.Popen, и эта оболочка также работает со всеми аргументами Popen, по крайней мере, насколько я помню :) В простых случаях лучше придерживаться subprocess.call
shabunc

Ответы:


270

subprocess.Popen принимает cwdаргумент для установки текущего рабочего каталога; Вы также захотите избежать обратной косой черты ( 'd:\\test\\local') или использовать ее r'd:\test\local'так, чтобы обратная косая черта не интерпретировалась Python как escape-последовательность. Как вы это написали, \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. Stone: Для автономного исполняемого файла это ничего не должно изменить, если, конечно, 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.