簡體   English   中英

將 Bash 變量讀入 Python 腳本

[英]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"]

我創建了一個這樣做的小庫:

https://github.com/aneilbaboo/shellvars-py

如果您嘗試獲取文件的來源,則缺少的內容是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM