Подтвердить что ты не робот

Прочитайте переменные Bash в Python script

Я запускаю bash script (test.sh) и загружается в переменные среды (из env.sh). Это работает отлично, но я пытаюсь увидеть, что python может просто загружать переменные уже в bash script.

Да, я знаю, что было бы проще просто передать конкретные переменные, которые мне нужны в качестве аргументов, но мне было любопытно, можно ли получить переменные bash.

test.sh

#!/bin/bash
source env.sh

echo $test1

python pythontest.py

env.sh

#!/bin/bash

test1="hello"

pythontest.py

?
print test1 (that is what I want)
4b9b3361

Ответ 1

Вам нужно экспортировать переменные в bash, или они будут локальными для bash:

export test1

Затем в python

import os
print os.environ["test1"]

Ответ 2

Предполагая, что переменные среды, которые устанавливаются, являются постоянными, и я думаю, что они не являются. Вы можете использовать os.environ.

os.environ["something"]

Ответ 4

Существует другой способ использования subprocess, который не зависит от настройки среды. С небольшим количеством кода.

Для оболочки script, которая выглядит следующим образом:

#!/bin/sh
myvar="here is my variable in the shell script"

function print_myvar() {
    echo $myvar
}

Вы можете получить значение переменной или даже вызвать функцию в оболочке script, как в следующем коде Python:

import subprocess

def get_var(varname):
    CMD = 'echo $(source myscript.sh; echo $%s)' % varname
    p = subprocess.Popen(CMD, stdout=subprocess.PIPE, shell=True, executable='/bin/bash')
    return p.stdout.readlines()[0].strip()

def call_func(funcname):
    CMD = 'echo $(source myscript.sh; echo $(%s))' % funcname
    p = subprocess.Popen(CMD, stdout=subprocess.PIPE, shell=True, executable='/bin/bash')
    return p.stdout.readlines()[0].strip()

print get_var('myvar')
print call_func('print_myvar')

Обратите внимание, что оба параметра shell=True должны быть установлены для обработки команды оболочки в CMD, которая должна обрабатываться как есть, и установите executable='bin/bash' для использования подстановки процесса, которая не поддерживается по умолчанию /bin/sh.