python subprocesso Ambiente Popen PATH?
Estou confuso sobre comosubprocess
procura o executável ao usarPopen()
. Funciona se dados caminhos absolutos para o processo filho, mas estou tentando usar caminhos relativos. Descobri que se eu definir a variável de ambiente PYTHONPATH, posso obter módulos importados desse caminho, ok, e PYTHONPATH estará lá emsys.path
, mas parece não ajudar no comportamento desubprocess.Popen
. Eu também tentei editar ositecustomize.py
arquivo adicionando PYTHONPATH aos.environ
, igual
# copy PYTHONPATH environment variable into PATH to allow our stuff to use
# relative paths for subprocess spawning
import os
if os.getenv('PYTHONPATH') is not None and os.getenv('PATH') is not none:
os.environ['PATH'] = ':'.join([os.getenv('PATH'), os.getenv('PYTHONPATH')])
e verificou que, ao iniciar o python, de maneira interativa, com o ipython, ou executando um script na linha de comando, o PYTHONPATH está aparecendo com êxito emos.environ
. Contudo,subrocess.Popen
aind não procura lá o executável. Eu pensei que era para herdar o ambiente dos pais, se nãoenv
kwarg está especificado? Em seguida, tentei darenv
explicitamente, primeiro fazendo uma cópia deos.getenv
e, em segundo lugar, apenas dandoenv={'PATH': '/explicit/path/to/search/from'}
e ainda não encontra o executável. Agora estou perplexo.
Felizmente, um exemplo ajudará a explicar meu problema com mais clareza:
/ dir / subdir1 / some_executable
/ dir / subdir2 / some_script.py
# some_script.py
from subprocess import Popen, PIPE
spam, eggs = Popen(['../subdir1/some_executable'], stdout=PIPE, stderr=PIPE).communicate()
Se eu estiver em/dir/subdir2
e eu corropython some_script.py
funciona, mas se eu estiver em/dir
e eu corropython subdir2/some_script.py
Apesar de/dir/subdir2
está noos.environ['PATH']
, o subprocesso lançaráOSError: [Errno 2] No such file or directory
.