![](/img/trans.png)
[英]How to set environment variables for current Command Prompt session from 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
然后,您只需要閱讀並解析它們:
#!/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中解析:
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.