Доступ к глобальным переменным в приложении Python из одного импорта - PullRequest
0 голосов
/ 28 июня 2018

Итак, я пытаюсь использовать интерпретатор python в качестве своего рода CLI для моего приложения Python на стороне сервера. Тем не менее, я получаю поведение, которого я не ожидал при загрузке модулей Python.

У меня есть два файла Python и файл кэша:

Main.py
Config.py
Cache.json

Итак, что происходит, когда Main импортируется и запускается, функция main () импортирует Configs, а затем вызывает функцию для инициализации Config. При инициализации Config загружает некоторые глобальные переменные из Cache.json в зависимости от среды, в которой я работаю. Вот упрощенный пример .py.

#Main.py
import Config

def main():
    """Initialize Python Application"""
    Config.init()


if __name__ == "__main__":
    main()

#Config.py
import os
import json

Default_MSSQLPassword = ""
Default_MSSQLUser = ""
Default_OdbccDriver = ""
MDGSQLP01 = ""


def init():
    """docstring"""

    with open("Cache.json", "r") as f:
        dtGlobalConstants = json.load(f)

    Default_MSSQLPassword = dtGlobalConstants["Default_MSSQLPassword"]
    Default_MSSQLUser = dtGlobalConstants["Default_MSSQLUser"]
    Default_OdbccDriver = dtGlobalConstants["Default_OdbccDriver"]
    MDGSQLP01 = dtGlobalConstants["MDGSQLP01"]

Теперь теоретически, если я вызову нижеприведенное в интерпретаторе python:

>>>from Main import main
>>>main()

Config должен быть импортирован с помощью main (), persist, и я должен быть в состоянии напечатать Cached значение Default_OdbccDriver, которое было загружено из Cache.json. Но вместо этого я получаю это:

>>>Config.Default_OdbccDriver
>>>''

Ясно, что Main импортирует Config.py, потому что в противном случае я получу ошибку при вызове свойства .Default_OdbccDriver. Однако, хотя значение Default_OdbccDriver предполагается «глобальным» (согласно нечетному определению слова в python), его значение должно быть статическим и сохраняться в кэше импорта.

Кто-нибудь знает, что происходит или как обойти это? В конце я хочу, чтобы main () инициализировал некоторые значения и раскрыл некоторые методы для работы с моим приложением, но это не очень хорошее начало ...

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Похоже, вы используете config, как если бы это был класс, но не определяете его как единое целое. если вам нужен объект конфигурации, вы можете определить его следующим образом:

#Config.py
import os
import json

class Config:

    def __init__(self):
        """docstring"""

    dtGlobalConstants = {}

    with open("Cache.json", "r") as f:
        dtGlobalConstants = json.load(f)

    Default_MSSQLPassword = dtGlobalConstants.get("Default_MSSQLPassword", "")
    Default_MSSQLUser = dtGlobalConstants.get("Default_MSSQLUser", "")
    Default_OdbccDriver = dtGlobalConstants.get("Default_OdbccDriver", "")
    MDGSQLP01 = dtGlobalConstants.get("MDGSQLP01", "")

Теперь, когда вы впервые создаете объект конфигурации, например config = Config(), объект config будет иметь все эти переменные.

Обратите внимание, что функция dict.get () установит ваши переменные в "", если не сможет найти их в этом dict

Если вместо этого вы используете классы, вы можете избежать использования глобальных переменных и даже обновить конфигурацию, чтобы она возвращала объект базы данных функционально, написав функцию get_db_object, так что вы можете просто использовать config.get_db_object () для создания ваш объект БД

0 голосов
/ 28 июня 2018

Вы должны объявить свои переменные как global в функции init, в противном случае вы просто устанавливаете некоторые локальные переменные функции, скрывающие глобальные:

def init():
    """docstring"""
    global Default_MSSQLPassword
    global Default_MSSQLUser
    global Default_OdbccDriver
    global MDGSQLP01

    with open("Cache.json", "r") as f:
        dtGlobalConstants = json.load(f)

    Default_MSSQLPassword = dtGlobalConstants["Default_MSSQLPassword"]
    Default_MSSQLUser = dtGlobalConstants["Default_MSSQLUser"]
    Default_OdbccDriver = dtGlobalConstants["Default_OdbccDriver"]
    MDGSQLP01 = dtGlobalConstants["MDGSQLP01"] 

Как вы говорите в комментарии, при импорте в сессию переменные связываются с Main.Config.your_var_name, для решения этого должно быть достаточно, чтобы объявить их глобальными и в модуле:

#Config.py
import os
import json

global Default_MSSQLPassword
global Default_MSSQLUser
global Default_OdbccDriver
global MDGSQLP01

Default_MSSQLPassword = ""
Default_MSSQLUser = ""
Default_OdbccDriver = ""
MDGSQLP01 = ""


def init():
    """docstring"""
    global Default_MSSQLPassword
    global Default_MSSQLUser
    global Default_OdbccDriver
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...