簡體   English   中英

無法使用Python修改環境變量(在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問題,可能會解釋您的問題:

我如何使環境變量在python中變化

Linux上的Python中的環境變量

因此,導致此問題的真正原因是,當我們運行一個流程時,該流程所更改的環境變量僅在流程運行時才可用,而不會更改外部變量,這里有一個簡化的腳本來證明這一點。 :

#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.

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