我正在运行自己的池控制系统,我想实现将某些系统参数复制到平面文件中,以便通过我正在处理的web界面进行处理。因为只有几个条目是我喜欢的。你知道吗
我建立了一个测试设置,效果很好。代码如下:
import ConfigParser
config = ConfigParser.ConfigParser()
get_pool_level_resistance_value = 870
def read_system_status_values(file, section, system):
config.read(file)
current_status = config.get(section, system)
print("Our current {} is {}.".format(system, current_status))
def update_system_status_values(file, section, system, value):
cfgfile = open(file, 'w')
config.set(section, system, value)
config.write(cfgfile)
cfgfile.close()
print("{} updated to {}".format(system, value))
def read_test():
read_system_status_values("current_system_status", "system_status",
"pool_level_resistance_value")
def write_test():
update_system_status_values("current_system_status", "system_status",
"pool_level_resistance_value",
get_pool_level_resistance_value)
read_test()
write_test()
read_test()
这是我的配置文件“当前\系统\状态”:
[system_status]
running_status = True
fill_control_manual_disable = False
pump_running = True
pump_watts = 865
pool_level_resistance_value = 680
pool_level = MIDWAY
pool_is_filling = False
pool_is_filling_auto = False
pool_is_filling_manual = False
pool_current_temp = 61
pool_current_ph = 7.2
pool_current_orp = 400
sprinklers_running = False
pool_level_sensor_battery_voltage = 3.2
pool_temp_sensor_battery_voltage = 3.2
pool_level_sensor_time_delta = 32
pool_temp_sensor_time_delta = 18
当我运行测试文件时,我得到以下输出:
ssh://root@scruffy:22/usr/bin/python -u /root/pool_control/V3.2/system_status.py
Our current pool_level_resistance_value is 350.
pool_level_resistance_value updated to 870
Our current pool_level_resistance_value is 870.
Process finished with exit code 0
这与预期完全一致。不过,当我把它移到我的主池_传感器.py模块,每次运行时都会出现以下错误:
Traceback (most recent call last):
File "/root/pool_control/V3.2/pool_sensors.py", line 58, in update_system_status_values
config.set(section, system, value)
File "/usr/lib/python2.7/ConfigParser.py", line 396, in set
raise NoSectionError(section)
ConfigParser.NoSectionError: No section: 'system_status'
Process finished with exit code 1
然后我进行了调试(使用PyCharm),当代码到达代码中的这一行时,我正在遍历代码:
cfgfile = open(file, 'w')
它彻底清除了我的文件,因此我得到了错误。当我调试我的测试文件,它得到完全相同的代码行,它打开文件,并按预期更新它。你知道吗
测试文件和实际文件都在同一台机器上的同一个目录中,使用的是同一版本的所有内容。打开和写入文件的代码与测试代码完全相同,“生产”代码中的debug print语句除外。你知道吗
我尝试了各种方法,包括:
cfgfile = open(file, 'w')
cfgfile = open(file, 'r')
cfgfile = open(file, 'wb')
但是不管我使用哪一个,一旦我在我的生产文件中包含了测试代码,一旦它到达那一行,它就会完全清除文件,而不是像我的测试文件那样更新它。你知道吗
下面是代码的相关行,我称之为:
import pooldb # Database information
import mysql.connector
from mysql.connector import errorcode
import time
import notifications
import logging
import ConfigParser
DEBUG = pooldb.DEBUG
config = ConfigParser.ConfigParser()
def read_system_status_values(file, section, system):
config.read(file)
current_status = config.get(section, system)
if DEBUG:
print("Our current {} is {}.".format(system, current_status))
def update_system_status_values(file, section, system, value):
cfgfile = open(file, 'w')
config.set(section, system, value)
config.write(cfgfile)
cfgfile.close()
if DEBUG:
print("{} updated to {}".format(system,value))
def get_pool_level_resistance():
""" Function to get the current level of our pool from our MySQL DB. """
global get_pool_level
try:
cnx = mysql.connector.connect(user=pooldb.username,
password=pooldb.password,
host=pooldb.servername,
database=pooldb.emoncms_db)
except mysql.connector.Error as err:
if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
logger.error(
'Database connection failure: Check your username and password')
if DEBUG:
print(
"Database connection failure: Check your username and "
"password")
elif err.errno == errorcode.ER_BAD_DB_ERROR:
logger.error('Database does not exist. Please check your settings.')
if DEBUG:
print("Database does not exist. Please check your settings.")
else:
logger.error(
'Unknown database error, please check all of your settings.')
if DEBUG:
print(
"Unknown database error, please check all of your "
"settings.")
else:
cursor = cnx.cursor(buffered=True)
cursor.execute(("SELECT data FROM `%s` ORDER by time DESC LIMIT 1") % (
pooldb.pool_resistance_table))
for data in cursor:
get_pool_level_resistance_value = int("%1.0f" % data)
cursor.close()
logger.info("Pool Resistance is: %s",
get_pool_level_resistance_value)
if DEBUG:
print(
"pool_sensors: Pool Resistance is: %s " %
get_pool_level_resistance_value)
print(
"pooldb: Static critical pool level resistance set at ("
"%s)." %
pooldb.pool_resistance_critical_level)
print(
"pooldb: Static normal pool level resistance set at (%s)." %
pooldb.pool_resistance_ok_level)
cnx.close()
print("We made it here with a resistance of (%s)" %
get_pool_level_resistance_value)
update_system_status_values("current_system_status",
"system_status",
"pool_level_resistance_value",
get_pool_level_resistance_value)
if get_pool_level_resistance_value >= pooldb.pool_resistance_critical_level:
get_pool_level = "LOW"
update_system_status_values("current_system_status",
"system_status",
"pool_level",
get_pool_level)
if DEBUG:
print("get_pool_level_resistance() returned pool_level = LOW")
else:
if get_pool_level_resistance_value <= pooldb.pool_resistance_ok_level:
get_pool_level = "OK"
update_system_status_values("current_system_status",
"system_status",
"pool_level",
get_pool_level)
if DEBUG:
print("get_pool_level_resistance() returned pool_level = OK")
if DEBUG:
print("Our Pool Level is %s." % get_pool_level)
return get_pool_level
我怀疑这可能与另一个导入有关,可能与open(文件,'w')冲突。你知道吗
我的主要模块是游泳池填充_控制.py它有这些进口产品:
import pooldb # Configuration information
import datetime
import logging
import os
import socket
import subprocess
import threading
import time
import RPi.GPIO as GPIO # Import GPIO Library
import mysql.connector
import requests
import serial
from mysql.connector import errorcode
import notifications
import pool_sensors
import ConfigParser
在该模块中的函数中,它调用我的池_传感器.py使用以下代码行显示的模块:
get_pool_level = pool_sensors.get_pool_level_resistance()
任何信息或帮助,为什么它的工作方式之一,而不是其他将不胜感激。你知道吗
好吧,有趣的是,在做了更多的研究和逐行查看代码之后,我意识到我在测试文件中所做的唯一不同的事情就是先读取文件,然后再写入。你知道吗
所以我修改了代码如下:
旧代码:
新代码(感谢@ShadowRanger)
现在它就像一个魔咒!!你知道吗
以下是步骤:
1)阅读
2)打开临时文件
3)更新
4)写入临时文件
5)关闭临时文件
6)在主文件上重命名临时文件
相关问题 更多 >
编程相关推荐