Python 3: настройка переменной среды с использованием exe c () - PullRequest
1 голос
/ 21 февраля 2020

Я пытаюсь использовать переменную окружения в функции, вызываемой скриптом. Проблема, которую я вижу, заключается в том, что переменная устанавливается в первый раз, но в следующий раз, когда я вызываю скрипт, она использует старое значение переменной. Я использую exe c () для вызова сценария python.

Вот минимальный пример:

Файл: test_run.py

import os
import sys
from io import StringIO
sigmas = [2.,20.]

for sigma in sigmas:            
            os.environ['SIGMA'] = str(sigma)
            buffer = StringIO()
            sys.stdout = buffer
            exec(open("parent.py").read())

            sys.stdout = sys.__stdout__
            result = buffer.getvalue()
            print (result)

            #print('SIGMA', os.environ['SIGMA'])
            buffer.close()

Файл : parent.py

import child

sigma_parent = float(os.environ['SIGMA'])

print (' Parent Function Sigma = ', sigma_parent)
child.my_func();

Файл: child.py

import os

sigma_child = float(os.environ['SIGMA'])

def my_func():
    print (' Child Function Sigma = ', sigma_child)

ВЫХОД:

 Parent Function Sigma =  2.0
 Child Function Sigma =  2.0

 Parent Function Sigma =  20.0
 Child Function Sigma =  2.0

1 Ответ

0 голосов
/ 22 февраля 2020

Ваш код даже не компилируется, поскольку вы import child, но выполняете test.my_func(). Настоящая проблема, однако, заключается в том, что вы используете exec(). Подумайте о том, что происходит, когда это выполняется. Будет выполнен код в parent.py , который получит текущее значение os.environ['SIGMA']. Но обратите внимание, что import child выполняется только один раз - при первом запуске содержимого parent.py . Это означает, что второй раз, когда ваш l oop выполнит этот оператор, больше не будет выполняться:

sigma_child = float(os.environ['SIGMA'])

Это означает, что my_func() в child.py будет только когда-либо видеть значение присваивается уровню модуля sigma_child var при первом импорте модуля.

Почему вы используете exec()? Почти никогда не правильно использовать exec().

...