Como posso especificar um diretório de trabalho para o popen


187

Existe uma maneira de especificar o diretório de comando em execução no Python subprocess.Popen()?

Por exemplo:

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

Meu script Python está localizado em C:\programs\python

É possível executar C:\mytool\tool.exeno diretório D:\test\local?

Como defino o diretório de trabalho para um subprocesso?


2
lembre-se de que subprocess.call é apenas um invólucro fino sobre o subprocesso.Popen, e esse invólucro também lida com todos os argumentos do Popen, pelo menos até onde me lembro :) Em casos simples, é melhor
seguir o

Respostas:


270

subprocess.Popen usa um cwdargumento para definir o Diretório de trabalho atual; você também deseja escapar das barras invertidas ( 'd:\\test\\local') ou usá- r'd:\test\local'las para que as barras invertidas não sejam interpretadas como seqüências de escape pelo Python. Do jeito que você escreveu, a \tparte será traduzida para a tab.

Portanto, sua nova linha deve se parecer com:

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

Para usar o caminho do script Python como cwd, import ose defina cwd usando isto:

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

2
Que efeito, se houver, a adição de Shell = True aos argumentos teria também na configuração do cwd?
T. pedra

3
@T. Stone: Para um executável independente, ele não deve mudar nada, a menos que o exe dependa de algumas variáveis ​​de ambiente no shell, talvez. Mas, com shell=False, você não pode usar um shell builtin tais como cd: ou seja, tente isso em Linux com o escudo de duas formas:subprocess.Popen("cd /tmp; pwd")
Mark Rushakoff

12
Em Python 3, pelo menos, você não tem que usar barras invertidas, mesmo quando em uma máquina Windows, eu apenas fiz subprocess.call(["C:/Users/Bob/Some.exe"], cwd="C:/Users/Jane/")e funciona bem
mgrandi

7
O diretório de trabalho precisa ser um caminho absoluto?
DXsmiley 29/05

10
Também funciona para subprocess.check_output (). Obrigado !
Samuel Dauzon
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.