Ответ 1
Вам нужно экспортировать переменные в bash, или они будут локальными для bash:
export test1
Затем в python
import os
print os.environ["test1"]
Я запускаю 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)
Вам нужно экспортировать переменные в bash, или они будут локальными для bash:
export test1
Затем в python
import os
print os.environ["test1"]
Предполагая, что переменные среды, которые устанавливаются, являются постоянными, и я думаю, что они не являются. Вы можете использовать os.environ
.
os.environ["something"]
Я создал небольшую библиотеку, которая делает это:
Существует другой способ использования 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
.