无法修改跨模块变量
Can't modify a cross module variable
我正在用 raspi 和雨量传感器做一个家庭项目。
基本上,对于 cronjobs,我 运行 isitraining.py 每 30 分钟。
如果正在下雨,我希望它增加另一个模块的特定变量 (rains.water)
如果雨停了,我希望它减少相同的变量。
这是我的代码:
rains.py
water=0
isitraining.py
import RPi.GPIO as GPIO
import rains
GPIO.setmode(GPIO.BCM)
GPIO.setup(4, GPIO.IN, pull_up_down=GPIO.PUD_UP)
def raincounter():
if (GPIO.input(4) and (0<rains.water<13)):
rains.water-=1 #No Rain
elif (GPIO.input(4)==0 and (0<rains.water<13)):
rains.water+=1 #Rain
testscript.py
import rains
import isitraining
isitraining.raincounter()
print (rains.water)
每次我 运行 第一次使用“testscript.py”时,它确实会修改“rains.water”变量但只有一次,如果我 运行之后的任何其他时间脚本,它的值都不会增加或减少。
仅供参考
gpio.input(4)是数字输入的雨量传感器。高时表示没有下雨,低时表示正在下雨。
有什么想法吗?
每次 testscript.py
运行时,它都会从头开始导入 isitraining.py
,然后从头导入 rains.py
。 rains.py
及其持有的 water
值不会在运行中持续存在。
如果要保存该值,需要手动将其写入磁盘,然后在需要使用时加载它。像这样:
isitraining.py
:
import RPi.GPIO as GPIO
import rains
GPIO.setmode(GPIO.BCM)
GPIO.setup(4, GPIO.IN, pull_up_down=GPIO.PUD_UP)
def raincounter():
if (GPIO.input(4) and (0<rains.water<13)):
return rains.alter_rain(-1) #No Rain
elif (GPIO.input(4)==0 and (0<rains.water<13)):
return rains.alter_rain(1)
rains.py
:
FILE_NAME = "rain_record.txt"
def alter_rain(n):
with open(FILE_NAME, "r") as f:
current_value = int(f.read()) # Get saved value
current_value += n # Alter it
with open(FILE_NAME, "w") as f:
f.write(str(current_value)) # Write the altered value back
return current_value # And return it so the caller knows the current value
testscript.py
import rains
import isitraining
new_val = isitraining.raincounter()
print (new_val)
您可以将对 open
的两次调用结合起来,并且还应该包括错误处理,但这显示了总体思路。您不能像您尝试做的那样使用简单的脚本来充当您的数据库。如果你想保存一些东西,你需要自己保存。
我正在用 raspi 和雨量传感器做一个家庭项目。
基本上,对于 cronjobs,我 运行 isitraining.py 每 30 分钟。
如果正在下雨,我希望它增加另一个模块的特定变量 (rains.water)
如果雨停了,我希望它减少相同的变量。
这是我的代码:
rains.py
water=0
isitraining.py
import RPi.GPIO as GPIO
import rains
GPIO.setmode(GPIO.BCM)
GPIO.setup(4, GPIO.IN, pull_up_down=GPIO.PUD_UP)
def raincounter():
if (GPIO.input(4) and (0<rains.water<13)):
rains.water-=1 #No Rain
elif (GPIO.input(4)==0 and (0<rains.water<13)):
rains.water+=1 #Rain
testscript.py
import rains
import isitraining
isitraining.raincounter()
print (rains.water)
每次我 运行 第一次使用“testscript.py”时,它确实会修改“rains.water”变量但只有一次,如果我 运行之后的任何其他时间脚本,它的值都不会增加或减少。
仅供参考 gpio.input(4)是数字输入的雨量传感器。高时表示没有下雨,低时表示正在下雨。
有什么想法吗?
每次 testscript.py
运行时,它都会从头开始导入 isitraining.py
,然后从头导入 rains.py
。 rains.py
及其持有的 water
值不会在运行中持续存在。
如果要保存该值,需要手动将其写入磁盘,然后在需要使用时加载它。像这样:
isitraining.py
:
import RPi.GPIO as GPIO
import rains
GPIO.setmode(GPIO.BCM)
GPIO.setup(4, GPIO.IN, pull_up_down=GPIO.PUD_UP)
def raincounter():
if (GPIO.input(4) and (0<rains.water<13)):
return rains.alter_rain(-1) #No Rain
elif (GPIO.input(4)==0 and (0<rains.water<13)):
return rains.alter_rain(1)
rains.py
:
FILE_NAME = "rain_record.txt"
def alter_rain(n):
with open(FILE_NAME, "r") as f:
current_value = int(f.read()) # Get saved value
current_value += n # Alter it
with open(FILE_NAME, "w") as f:
f.write(str(current_value)) # Write the altered value back
return current_value # And return it so the caller knows the current value
testscript.py
import rains
import isitraining
new_val = isitraining.raincounter()
print (new_val)
您可以将对 open
的两次调用结合起来,并且还应该包括错误处理,但这显示了总体思路。您不能像您尝试做的那样使用简单的脚本来充当您的数据库。如果你想保存一些东西,你需要自己保存。