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?

icn
fonte
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__)) 
Mark Rushakoff
fonte
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