Как звонить. Файл /home/test.sh в скрипте Python
У меня есть файл с именем . /home/test.sh(пробел между первым .и /намеренно), который содержит некоторые переменные среды. Мне нужно загрузить этот файл и запустить .py. Если я сначала запускаю команду вручную на сервере Linux, а затем запускаю скрипт python, он генерирует требуемый результат. Однако я хочу позвонить . /home/test.shиз python, чтобы загрузить профиль и запустить остальной код. Если этот профиль не загружен, запускаются скрипты python и на выходе выдается 0.
Вызов
subprocess.call('. /home/test.sh',shell=True)
работает нормально, но профиль не загружается в терминал Linux для выполнения кода Python и выдачи желаемого результата.
Может кто поможет?
Ответы
Переменные среды не наследуются родительским процессом напрямую, поэтому ваш простой подход не работает.
Если вы пытаетесь выбрать переменные среды, которые были установлены в вашем test.sh, то вместо этого вы можете использовать envво вспомогательной оболочке, чтобы записать их в стандартный вывод после получения скрипта, а затем в Python вы можете проанализировать их и установить их локально.
Приведенный ниже код будет работать при условии, что test.shсам не записывает никаких выходных данных. (Если это так, то что вы могли бы сделать, чтобы обойти это, - это использовать echoнекоторую строку разделителя после ее получения и перед запуском env, а затем в коде Python удалить строку разделителя и все, что перед ней.)
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")
Также стоит учесть, что если все, что вы хотите сделать, это устанавливать некоторые переменные среды каждый раз перед запуском любого кода Python, тогда один из вариантов - просто получить ваш файл test.shиз оболочки сценария оболочки, а не пытаться установить их внутри Python вообще:
#!/bin/sh
. /home/test.sh
exec "/path/to/your/python/script $@"
Затем, когда вы хотите запустить код Python, вместо этого вы запускаете оболочку.