[英]Read Bash variables into a Python script
我正在運行一個 bash 腳本(test.sh),它加載到環境變量中(來自 env.sh)。 這很好,但我試圖看到 python 可以加載已經在 bash 腳本中的變量。
是的,我知道將我需要的特定變量作為參數傳遞可能會更容易,但我很好奇是否可以獲取 bash 變量。
測試.sh
#!/bin/bash
source env.sh
echo $test1
python pythontest.py
您需要在 bash 中導出變量,否則它們將是 bash 的本地變量:
export test1
然后,在蟒蛇
import os
print os.environ["test1"]
還有另一種使用subprocess
,它不依賴於設置環境。 不過,多一點代碼。
對於如下所示的 shell 腳本:
#!/bin/sh
myvar="here is my variable in the shell script"
function print_myvar() {
echo $myvar
}
您可以檢索變量的值,甚至可以在 shell 腳本中調用函數,如下面的 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
中的 shell 命令按原樣處理,設置executable='bin/bash'
使用進程替換,默認/bin/sh
不支持.
假設設置的環境變量是永久性的,我認為它們不是。 您可以使用os.environ
。
os.environ["something"]
我創建了一個這樣做的小庫:
如果您嘗試獲取文件的來源,則缺少的內容是set -a
。 例如,要獲取env.sh
,您可以運行:
set -a; source env.sh; set +a.
您需要這樣做的原因是 bash 的變量對於 bash 來說是本地的,除非它們被導出。 -a 選項指示 bash 導出所有新變量(直到您使用 +a 將其關閉)。 通過在source
之前使用set -a
,所有由source
導入的變量也將被導出,因此可用於 python。
信用:此命令來自@chepner 作為對此答案的評論發布的評論。
兩個附加選項,在您的特定情況下可能會或可能不會有幫助:
選項1:
如果 env.sh 僅包含常規 NAME=value,則讓 python 讀取它(作為文本文件)。
這僅適用於您控制 env.sh 的格式,並且 env.sh 不包含任何真正的 shell 命令,並且您控制包含的 shell 腳本的情況。
選項 2:
在 shell 腳本中,一旦設置了所有必要的變量,要么將它們保存到文件中,要么將它們作為標准輸入通過管道傳輸到 python 腳本:
#!/bin/bash
source env.sh
echo $test1
set | python pythontest.py
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.