Como ligar . arquivo /home/test.sh no script python

Sep 11 2020

Eu tenho o arquivo chamado . /home/test.sh(o espaço entre o primeiro .e /é intencional) que contém algumas variáveis ​​ambientais. Preciso carregar este arquivo e executar o .py. Se eu executar o comando manualmente primeiro no servidor Linux e, em seguida, executar o script python, ele gerará a saída necessária. No entanto, quero fazer uma chamada . /home/test.shde dentro do python para carregar o perfil e executar o restante do código. Se este perfil não for carregado, os scripts Python serão executados e fornecerão 0 como saída.

A chamada

subprocess.call('. /home/test.sh',shell=True)

funciona bem, mas o perfil não é carregado no terminal Linux para executar o código python e fornecer a saída desejada.

Alguém pode ajudar?

Respostas

2 alani Sep 12 2020 at 05:10

As variáveis ​​de ambiente não são herdadas diretamente pelo processo pai, e é por isso que sua abordagem simples não funciona.

Se você está tentando pegar variáveis ​​de ambiente que foram definidas em seu test.sh, então uma coisa que você pode fazer em vez disso é usar envem um sub-shell para gravá-las no stdout depois de fornecer o script e, em Python, você pode analisá-las e defina-os localmente.

O código abaixo funcionará desde que test.shnão escreva nenhuma saída. (Se sim, então o que você poderia fazer para contornar isso seria echoalguma string separadora depois de fornecê-la, e antes de executar o enve, em seguida, no código Python, retirar a string separadora e tudo antes dela.)

import subprocess
import os

p = subprocess.Popen(". /home/test.sh; env -0", shell=True, 
                     stdout=subprocess.PIPE,
                     stderr=subprocess.PIPE)

out, _ = p.communicate()

for varspec in out.decode().split("\x00")[:-1]:
    pos = varspec.index("=")
    name = varspec[:pos]
    value = varspec[pos + 1:]
    os.environ[name] = value

# just to test whether it works - output of the following should include
# the variables that were set
os.system("env")

Também vale a pena considerar que, se tudo o que você deseja fazer é definir algumas variáveis ​​de ambiente todas as vezes antes de executar qualquer código python, então uma opção é apenas fornecer seu a test.shpartir de um wrapper de script de shell e não tentar defini-las dentro de python em absoluto:

#!/bin/sh
. /home/test.sh
exec "/path/to/your/python/script $@"

Então, quando você quiser executar o código Python, execute o wrapper.