Hi,
Very new to Python and trying to figure out how I can get the value from a variable in one script into another.
I have a python script called "Accelerator" which gets a constantly changing value from a UDP packet and then prints that value to the screen
-> print("Revs = " + str(int(revsPC)))
What I want to do is grab that value in revsPC pass it to another script and display it
I have tried the import i.e import Accelerator but this I understand executes the whole Accelerator script which throws up an error. I have also tried import revsPC from Accelerator but that doesn't seem to do anything.
Am I missing something really obvious? I am very new to python so my ignorance is high!
Thanks in advance for any help.
# Accelerator.py
revs_pc = 999
if __name__ == '__main__':
print(f"Revs = {revs_pc}")
# bar.py
import Accelerator
import math
def foo(arg):
value = math.factorial(arg) + Accelerator.revs_pc
return value
if __name__ == '__main__':
print(foo(10))
Output:
3629799
So it's a good practice to use
if __name__ == '__main__'
,then dos code after that do not execute when import it.
Have to call
Accelerator.revs_pc
to get 999.
Also look that i use
f-string
to avoid the not so nice way
print("Revs = " + str(int(revsPC)))
.
That's great and works a treat but the revsPC data is generated from a value inside a UDP packet where the connection is established at the start of the script and the the revsPC variable is inside a loop. I know my syntax is not great or neat but it does do the basic job of determining my revsPC value.
import sys
import socket
import time
UDP_IP = ""
UDP_PORT1 = 40002
sock1 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock1.bind((UDP_IP, UDP_PORT1))
#definition of the function for mapping a range values to another
def translate(value, inputMin, inputMax, outputMin, outputMax):
# Figure out how 'wide' each range is
inputSpan = inputMax - inputMin
outputSpan = outputMax - outputMin
# Convert the input range into a 0-1 range (float)
valueScaled = float(value - inputMin) / float(inputSpan)
# Convert the 0-1 range into a value in the output range.
return outputMin + (valueScaled * outputSpan)
counter = 0
while True:
#Beginning of the program
tmps1=time.time()
data, addr = sock1.recvfrom(1024) # length of the buffer : 1024 bytes
hiValRPM = data1[0]
loValRPM = data1[1]
print("--------------------------")
print("Data Received : " + str(hiValRPM) + "/" + str(loValRPM))
print(" ")
#Revs : Mapping from 0-1023 to 0-6000
if(hiValRPM == 0):
revsPC = translate(loValRPM, 0, 255, 0, 1503)
elif(hiValRPM == 1):
revsPC = translate(loValRPM, 0, 255, 1504, 3004)
elif(hiValRPM == 2):
revsPC = translate(loValRPM, 0, 255, 3005, 4503)
elif(hiValRPM == 3):
revsPC = translate(loValRPM, 0, 255, 4504, 6000)
print("Revs = " + str(int(revsPC)))
#Calculation of the program execution time
tmps2=(time.time()-tmps1)*1000
print ("Execution time = %f ms" %tmps2)
counter += 1
print("Packet number : " + str(counter))
Now you run a infinity loop(while True) with no break out of the loop.
So need a way to get value out,one way can by to rewire it so it's a generator.
# Accelerator.py
import random
import time
def foo():
while True:
time.sleep(3)
revs_pc = random.randint(1,10)
yield revs_pc
# bar.py
import Accelerator
for i in range(10):
revs_pc = next(Accelerator.foo())
revs_pc += 9 # do something with revs_pc value
print(revs_pc)
Output:
12
16
13
11
10
10
15
10
19
14