Pergunta

No Linux Quando invoco python a partir do shell ele replica seu ambiente, e inicia o processo de python. Portanto, se eu faço algo como o seguinte:

import os
os.environ["FOO"] = "A_Value"

Quando o processo de python retorna, FOO, assumindo que era indefinido inicialmente, vai ainda ser indefinido. Existe uma maneira para o processo de python (ou qualquer processo filho) para modificar o ambiente de seu processo pai?

Eu sei que você normalmente resolver este problema usando algo como

source script_name.sh

Mas este conflito com outros requisitos que tenho.

Foi útil?

Solução

Nenhum processo pode mudar seu processo pai (ou qualquer outro ambiente de processo existente).

Você pode, no entanto, criar um novo ambiente, criando um novo shell interativo com o meio ambiente modificado.

Você tem que gerar uma nova cópia do shell que utiliza o ambiente atualizado e tem acesso ao existente stdin, stdout e stderr, e faz sua dança reinicialização.

Você precisa fazer algo como o uso subprocess.Popen para executar /bin/bash -i.

Assim, o shell originais corre Python, que executa um novo shell. Sim, você tem um monte de processos em execução. Não, não é muito ruim porque o shell original e Python não estão fazendo nada, exceto esperando o subnível ao fim para que eles possam sair de forma limpa, também.

Outras dicas

Não é possível, por qualquer processo filho, para mudar o ambiente do processo pai. O melhor que você pode fazer é declarações shell saída para stdout que você, em seguida, fonte, ou gravá-lo em um arquivo que você fonte no pai.

Gostaria de usar a declaração do bash eval, e ter a saída do script python o código shell

child.py:

#!/usr/bin/env python
print 'FOO="A_Value"'

parent.sh

#!/bin/bash
eval `./child.py`
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top