I have some serious lack of knowledge on how variables in python work. My code is spread between multiple modules and I will try to write only the more important stuff:
#price.py import math LAMBDA = 0.03 EPSILON = 0.97 SCALING_PARAMETER = 10 # Used for initializing the propensities FEED_IN_TARIFF = 8.50 UTILITY_PRICE = 33 PRICE_SET = list(range(math.floor(FEED_IN_TARIFF), math.floor(UTILITY_PRICE) + 1)) AVERAGE_PROFIT = sum(PRICE_SET) / len(PRICE_SET) probabilities = [1 / len(PRICE_SET)] * len(PRICE_SET) propensities = [SCALING_PARAMETER * AVERAGE_PROFIT / len(PRICE_SET)] * len(PRICE_SET) def algo(p_local_sell=0, p_grid_sell=0, p_local_buy=0, cl_price=0): if p_local_sell != 0 or p_grid_sell != 0: r_prosumer = p_local_sell * cl_price + p_grid_sell * FEED_IN_TARIFF elif p_local_buy != 0: r_consumer = p_local_buy * abs(FEED_IN_TARIFF - cl_price) prop_i = PRICE_SET.index(cl_price) if p_local_sell != 0 or p_grid_sell != 0: propensities[prop_i] = (1 - LAMBDA) * propensities[prop_i] + r_prosumer * (1 - EPSILON) elif p_local_buy != 0: propensities[prop_i] = (1 - LAMBDA) * propensities[prop_i] + r_consumer * (1 - EPSILON) for i in range(0, prop_i): propensities[i] = (1 - LAMBDA) * propensities[i] + (propensities[i] * EPSILON) / (len(PRICE_SET) - 1) for i in range(prop_i + 1, len(propensities)): propensities[i] = (1 - LAMBDA) * propensities[i] + (propensities[i] * EPSILON) / (len(PRICE_SET) - 1) for i in range(0, len(probabilities)): probabilities[i] = propensities[i] / sum(propensities) #handler.py import price import numpy as np def update_data(data): # some unimportant calculations price.algo(data[local],data[grid],data[buy],data[price]) def get_price(): # some unimportant calculations price = np.random.choice(price.PRICE_SET,1,p=price.probabilities) return int(price)
The code is in docker containers and when I execute the
update_data(data) function, and
docker exec -it "container_name" python3 -c "import price; print(price.propensities)" it returns always the initial ones.
- Am I checking the values wrong, when I try to print the values within the containers?
- Do the variables have to be global for this to work?
- Is my understanding so poor, that what I am trying to do is not possible and I would be better off when I write the values into an external file and read them from there?
docker exec command starts a new Python process, imports the module, and then prints the value. Of course the value is the default, because you just imported the module and did nothing with it in that Python process.
This is not a problem of module scope, but of process scope. If you want to get a value from a process that is already running, you would typically send some kind of request there, which means that the process would have to be a server that responds to requests. Maybe there are ways to use debugging interfaces to connect to a running process, but that’s not something I’d recommend for anything but interactive debugging.
If you’re only interested in certain values, and these change only at well-defined times, you could let the process write the values to a file every time they change, and then read the file from
docker exec. But then you’d still have to guard against the case that the file is being overwritten while you’re reading it.