Python Forum

Full Version: Sharing variables across modules
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Hey all,
today I somehow managed to get stuck with getting a variable in one module changed by a function in another module - something I had working last time I wrote multi-module scripts.

Simplifying the code (otherwise requiring Kivy to run), I have:

main.py:
from kivy.app import App
import parameters
import utils


class MainApp()
    def on_start(self): # runs when application starts
        utils.read_config_file() # reads config text file and should modify parameters dictionary accordingly
        Window.clearcolor = hex2color(parameters.parameters["background_color"]) # should use new color value instead of default one

if __name__ == '__main__':
    MainApp().run()
parameters.py:
# dictionary with default values
parameters= {
    "config_file": "config.txt",
    "width": "800",
    "height": "400",
    "background_color": "#FFFFFF",
}
utils.py
import parameters


# reads config.txt file and should overwrite default values in parameters dictionary with those found in file
def read_config_file():
    with open(parameters.parameters["config_file"], "r") as config_file:
        for line in config_file:
            if line == "\n" or line == "":
                continue
            key, value = line.strip().split() 
            parameters.parameters[key[:-1]] = value.strip()       
I would like the parameters dictionary (in parameters.py module) to be referenced from other modules, so the variables can be shared.
First on application startup, a configuration text file is to be read and values in parameters dictionary overwritten with those found in file.
However, the values in dictionary are not affected by read_config_file() function in utils.py. The values from file are read correctly though.

What am I missing? Is there some variable/module naming conflict I overlooked? Am I doing the imports incorrectly?
Thanks for hints,
JC
It's working for me in 2.7 and 3.6. What version are you using?
The verson is 3.7.0, I considered whether the reason could be using latest Python, but that would be rather odd.
It looks like changes were made to imports in 3.7, but it's not obvious to me how they would result in that behavior. Is there some reason not to put read_config_file in parameters.py? Does it work if you explicitly pass parameters.parameters to read_config_file as a parameter?
It doesn't work if I pass parameters.parameters explicitly, nor if I put read_config_file in parameters.py
The reason why I didn't do it in the first place though was that I wanted parameters.py to contain only variables, no functions.
Well, that's one heck of a mistery, but I'll try to find out what is going on.