2015-09-09 2 views
0

У меня есть полу-большое приложение python, которое работает на linux. Я пытаюсь настроить его, чтобы я мог прочитать файл конфигурации при запуске программы, а затем сохранить эти значения для использования в любое время во время работы приложения, не перечитывая файл конфигурации.Как передать глобальные переменные между файлами в python

Так что я пытаюсь загрузить класс configValues ​​в своем первом modual, test.py. И прочитайте установленные значения. Затем в этом примере снова прочитайте значения в test2.py.

Я никогда не получаю значения. Кто-нибудь может мне помочь?

Config.py

class config(): 

    def __init__(self): 
     configFile = File(myPath) 
     if configFile.exist(): 
      myXML = str(configFile.openAndRead()) 

    def setupValues(self): 
     configValues.color = self.getElement('color') 

    def getElement(self, element): 
     tree=et.fromstring(self.myXML) 

     for el in tree.findall('head'): 
      for ch in el.findall(element): 
      return ch.text 


class configValues(): 

    def __init__(self): 
     global color 

test.py

import config 

class test(): 

    def __init__(self): 
     configObj = config.Config() 
     configVal = config.configValues() 

     configObj.setupValues() 
     print configVal.color 

test2.py

import config 

class test2(): 

    def __init__(self): 
     configVal = config.configValues() 

     print configVal.color 
+0

Попробуйте сделать 'color' [переменной класса] (http://stackoverflow.com/questions/68645/static-class-variables-in-python). – jojonas

+0

Ваш отступ нуждается в фиксации. –

+0

stackoverflow не отображает код правильно, когда я попытался изменить отступ здесь. Прекрасно работает в моем действительном коде. –

ответ

0

Добавить глобальную переменную и для вашего config.py. И вместо создания configobj в test1.py и test2.py вы можете вызвать эту функцию, чтобы получить объект конфигурации.

configobj = None 

def getconfigobj(): 
    global configobj 
    if not configobj: 
    configObj = config.Config() 
    return configobj 

Редактировать согласно комментарии. Есть ли что-то вроде следующего помощи (с использованием одного экземпляра для класса): -

config.py

class config(): 
     _instance = None 
     def __new__(cls): 
      if config._instance: 
       return config._instance 
      return super(config, cls).__new__(cls) 


     def __init__(self, myPath): 
      configFile = File(myPath) 
      if configFile.exist(): 
       myXML = str(configFile.openAndRead()) 
      config._dict['instance'] = self 

     def setupValues(self): 
      self.color = self.getElement('color') 

     def getElement(self, element): 
      tree=et.fromstring(self.myXML) 

      for el in tree.findall('head'): 
       for ch in el.findall(element): 
       return ch.text 

test1.py

import config 
class test(): 
    def __init__(self): 
     configObj = config.Config() 
     configObj.setupValues() 
     print configObj.color 

test2.py

import config 
class test2(): 
    def __init__(self): 
     configObj = config.Config() 
     print configObj.color 
+0

Спасибо, но я немного смущен. Есть ли способ изменить код, который я опубликовал, чтобы показать, что вы имеете в виду? –

+0

Спасибо. Он отлично работает и не позволяет программе выполнять IO каждый раз, когда мне нужны данные. –

0

Я бы не использовать глобальные переменные в этом случае. Вы можете присвоить значения конфигурации в качестве свойств конфигурации и использовать его следующим образом: config.py

class Config: 
    def __init__(self): 
     # property of the config class 
     self.color = 'my default color' 
     # open your config file .. 

    def setup_values(self): 
     # assign new value 
     self.color = self.get_color() 

    def get_color(self): 
     # get values from config xml file .. 
     return "red" 

А затем импортировать конфигурации в другом модуле и вызовите свойство цвета: main.py

from config import Config 

class Main: 
    def __init__(self): 
     config = Config() 
     config.setup_values() 
     color = config.color 
     print color 

Main() 

Я хотел бы также сократить код с одного методом меньше, получая значение конфигурации в конструкторе, а не в дополнительной методе «setup_values» как так:

class Config: 
    def __init__(self): 
     # property of the config class 
     self.color = self.get_color() 

    def get_color(self): 
     # open your config file .. 
     # get values from config xml file .. 
     return "red" 

и main.py должен выглядеть следующим образом:

from config import Config 

class Main: 
    def __init__(self): 
     config = Config() 
     color = config.color 
     print color 

Main() 

Имейте в виду, что это не очень хорошая практика, чтобы использовать глобальные переменные в коде, так что предложенный выше код может сделать эту работу за вас.

+0

Проблема в том, что каждый раз, когда я создаю Config, он будет читать xml-файл из файловой системы. Я пытаюсь избежать такого удара каждый раз, когда мне нужны ценности. –

+0

Я бы использовал какой-то магазин, как в xml или json или sqllite, и получал значения оттуда каждый раз, когда мне это нужно, вместо использования глобальных переменных, если это возможно. –

Смежные вопросы