簡體   English   中英

將bash腳本中的環境變量分配給Python中的當前會話

[英]Assign environment variables from bash script to current session from Python

我有許多bash腳本可幫助設置我當前的會話環境變量。 我需要設置env變量,以便可以使用子進程模塊在python腳本中運行命令。 這是我執行bash腳本的方式:

. ./file1.sh

以下是bash腳本的開頭:

echo "Setting Environment Variable..."
export HORCMINST=99
echo $HORCMINST
...

有沒有辦法從python腳本調用這些bash腳本或在python腳本中執行類似的操作?

在現有腳本中使用shell=True

首先,就最簡單的事情而言 -如果您使用shell=True ,則可以告訴外殼程序開始運行未經修改的現有腳本的內容。

也就是說-如果您最初是這樣做的:

subprocess.Popen(['your-command', 'arg1', 'arg2'])

...然后,您可以執行以下操作以在幾乎相同的安全性保證下執行同一命令(只要可信任file1.sh的內容,唯一的其他漏洞就是諸如shellshock之類的帶外問題。 ):

# this has the security of passing explicit out-of-band args
# but sources your script before the out-of-process command
subprocess.Popen(['. "$1"; shift; exec "$@"', "_", "./file1.sh",
    "your-command", "arg1", "arg2"], shell=True)

使用/proc/self/environ在NUL分隔的流中導出環境變量

理想的操作是以明確的形式導出環境變量-NUL分隔的流是理想的-然后在Python中解析該流(格式非常明確)。

假設使用Linux,則可以按如下所示導出完整的環境變量集:

# copy all our environment variables, in a NUL-delimited stream, to myvars.environ
cat </proc/self/environ >myvars.environ

...或者您可以手動導出一組特定的變量:

for varname in HORCMINST PATH; do
  printf '%s=%s\0' "$varname" "${!varname}"
done >myvars.environ

在Python中讀取和解析NUL分隔的流

然后,您只需要閱讀並解析它們:

#!/usr/bin/env python
env = {}
for var_def in open('myvars.environ', 'r').read().split('\0'):
  (key, value) = var_def.split('=', 1)
  env[key] = value

import subprocess
subprocess.Popen(['your-command', 'arg1', 'arg2'], env=env)

您也可以通過運行os.environ[key]=value立即應用這些變量。


在bash中讀取和解析NUL分隔的流

順便說一下,同樣的格式也很容易在bash中解析:

while IFS= read -r -d '' var_def; do
  key=${var_def%%=*}
  value=${var_def#*=}
  printf -v "$key" '%s' "$value"
  export "$key"
done <myvars.environ

# ...put the rest of your bash script here

現在, 為什么要使用NUL分隔的流? 由於環境變量是C字符串-與Python字符串不同,它們不能包含NUL。 因此,NUL是可以安全地用於定界的唯一字符。

例如,一個嘗試使用換行符的人可能會被一個包含文字換行符的環境變量所困擾-並且,例如,如果有人將一個簡短的Python腳本嵌入到一個環境變量中,那是一個非常合理的事件!

您應該考慮使用Python內置的os 模塊 os.environ屬性是您可以閱讀的環境變量字典,例如

import os
os.environ["USER"]

但是,您不能從子進程中編寫 bash環境變量(請參見例如, 如何在Linux上的Python中使用export )。

您的兩個問題都已得到回答。 您可以使用類似以下命令從python執行bash腳本:

import subprocess
subprocess.Popen("cwm --rdf test.rdf --ntriples > test.nt")

看到這個問題在python中運行bash命令

更好地直接在Python 中設置環境變量 ,請參見此問題如何在Python中設置環境變量

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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