Mac OS X: altere $PATH no script python

Mac OS X: altere $PATH no script python

Eu tenho vários scripts python. Um deles instala software (subversion) que exige que seu caminho seja adicionado ao $PATH. Depois de instalado, quero que o próximo script use o software. Se eu executar export PATH=/opt/subversion/bin:$PATHno bash entre o primeiro e o segundo script, tudo ficará bem. Mas se eu adicionar os.system( 'export PATH=/opt/subversion/bin:$PATH' )como último comando o primeiro script (que instala o subversion), $PATHpermanece inalterado após sua saída.

Existe alguma maneira de alterar $PATH no script python para que ele permaneça alterado após a conclusão do script (dentro de uma única sessão bash, é claro, eu conheço /etc/profile).

Responder1

os.system()gera um sub-shell. Portanto, ele não tem conhecimento do seu shell existente.

É claro que você pode definir o caminho (sem exportar) ao executar o comando. Ou seja:

PATH="$PATH:/opt/subversion/bin" /command/to/run

Ah, e os.system() está sendo depreciado. Você deve mudar parasubprocess.Popen().

Responder2

Geralmente, isso não é possível. Um processo não pode alterar o ambiente de outro processo.

Um pai pode predefinir o ambiente de um processo filho que ele gera, mas realmente não há nenhuma maneira de um processo influenciar o ambiente de outro, a menos que esses aplicativos sejam projetados especificamente para permitir isso.

Responder3

Como outros apontaram, não, não há realmente nenhuma maneira de modificar o ambiente de um processo pai. Seria necessário mexer na memória do processo pai e, até onde eu sei, não há uma maneira bem definida de fazer isso (ou seja, você provavelmente travaria seu shell).

Se os scripts/programas que você executa posteriormente forem python, você poderá, como primeira coisa a fazer nesses programas, acrescentar o caminho para o subversion em seu ambiente.

import os
os.environ['PATH'] = "/opt/subversion/bin:" + os.environ['PATH']

Ou se você sempre executa os mesmos scripts na mesma ordem com os mesmos argumentos, envolva-os em um script de shell que define o ambiente para si e executa esses programas/scripts.

Há outra solução alternativa também, como a última coisa que você faz no script que instala o subversion, você pode substituir esse processo por outro shell que tenha o ambiente desejado. Você executará um bash dentro do bash, mas bem, isso pode servir como uma boa solução alternativa.

#! /usr/bin/env python

# do stuff
# install subversion
# do more stuff

# at the point you exit
if everything_went_well:
  import os
  os.putenv('PATH', '/opt/subversion/bin:' + os.environ['PATH'])
  os.execv('/bin/bash', [])

informação relacionada