[英]Can we pass a environment variable modified by python script to the outer shell?
[英]Can't modify environment variable(assigned in Shell Script) using Python
我正在嘗試在Shell腳本中創建一個循環,當我在特定字符串中找到一個不同於0的整數時(使用Python),我想打破循環並完成Shell腳本的執行。 shell腳本一直在執行該特定字符串中首次出現一個不同於0的整數。我試圖通過回顯GET_OUT_OF_LOOP的值來對其進行調試,但是即使找到了我想要的整數,它也一直保持回顯0。 我已經在網上尋找實現此目的的方法,但是我仍然沒有弄清楚……這是我的shell腳本:
#!/bin/sh
export GET_OUT_OF_LOOP=0
while [ $GET_OUT_OF_LOOP -ne 1 ]; do
python3 provas.py provas.txt
./provas < provas.txt >> data.txt
python3 test.py data.txt
sh clear_data.sh
done
這是我的Python代碼(test.py),我正在其中嘗試使用os.environ
更改GET_OUT_OF_LOOP變量的值:
#!usr/env/bin python3
import sys
import os
import re
script, filename = sys.argv
os.environ['GET_OUT_OF_LOOP'] = '0'
fin = open("data.txt", 'r')
for line in fin:
if "A percentagem de aprovação foi de" in line:
if int(re.search(r'\d+', line).group()) != 0:
print(line)
os.environ['GET_OUT_OF_LOOP'] = '1'
python進程是shell進程的子進程,它不能修改其父進程的環境變量。
對於您的情況,您可以使用退出代碼來傳遞消息。 即
外殼腳本:
python3 test.py data.txt || GET_OUT_OF_LOOP=1
蟒蛇:
#!usr/env/bin python3
import sys
import os
import re
script, filename = sys.argv
fin = open("data.txt", 'r')
for line in fin:
if "A percentagem de aprovação foi de" in line:
if int(re.search(r'\d+', line).group()) != 0:
print(line)
sys.exit(1)
sys.exit(0)
這就是環境變量的工作方式:您不能在子流程中更改調用它的流程環境中的變量。 (在shell腳本中,幾乎所有代碼行,但對於控制結構,都是外部子進程)
您可以擁有的是子進程的簡單無符號字節返回值,該值可以在shell腳本中作為隱式$?
讀取$?
變量。
在Python的情況下,您可以通過調用sys.exit()
使用此返回值終止程序。
因此,在您的shell腳本中,您可以執行以下操作來分配變量:
python3 test.py data.txt
GET_OUT_OF_LOOP=$?
並且Python腳本中的Python發生了變化:
os.environ['GET_OUT_OF_LOOP'] = '1'
對於
sys.exit(1)
當然,如果yu從頭開始一直使用Python,它將更加理智和可維護shutils
中的shutils
模塊使復制文件變得容易,而且最重要的是,您在所有行上都獲得了一致的語法腳本,使用比較運算符和變量要容易得多。
這是兩個類似的stackoverflow問題,可能會解釋您的問題:
因此,導致此問題的真正原因是,當我們運行一個流程時,該流程所更改的環境變量僅在流程運行時才可用,而不會更改外部變量,這里有一個簡化的腳本來證明這一點。 :
#test.py
import os
os.environ['test_env_var'] = '1'
#test.sh
export test_env_var=0
while [ $test_env_var -ne 1 ]; do
python test.py
echo $test_env_var
done
您可能已經看到了即將發生的情況,該循環將回顯$ tev永遠為0。 因此,據我所知,解決此問題的解決方案是,如有必要,將更改外包給外部系統文件。 附加對相關系統的配置文件的更改,例如,在本示例中,如果您是linux bash用戶,則可以將“ export test_env_var = 1”附加到〜/ .bashrc中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.