내 자신의 풀 컨트롤 시스템을 실행 중이며 작업중인 웹 인터페이스에서 처리하기 위해 특정 시스템 매개 변수를 플랫 파일에 복사하는 방법을 구현하고 싶습니다. 몇 가지 항목이 있기 때문에 작업을위한 ConfigParser를 좋아했습니다.Python에서 ConfigParser 사용 - 배포 된 후 OK이지만 닦아내는 파일을 테스트합니다.
테스트 설정을 작성 했으므로 훌륭하게 작동했습니다. 내 테스트 파일을 실행하면
[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://[email protected]: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
이 정확히 같다 이건 내 설정 파일 "current_system_status는"
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()
입니다 : 여기에 코드입니다 예상했다. 내 주요 pool_sensors.py 모듈로 이동할 때, 언제 나는 그것을 실행 내가받을 다음과 같은 오류 : 나는 즉시이수록 코드를 걷고 나는 다음 디버깅 (PyCharm 사용)
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
코드에서이 라인 :
cfgfile = open(file, 'w')
는 완전히 내 파일을 지워 버리고, 따라서 나는 NoSectionError를 얻을. 테스트 파일을 디버그하고 정확히 동일한 코드 행을 가져 오면 파일을 열고 예상대로 업데이트합니다.
테스트 파일과 실제 파일 모두 동일한 버전의 모든 것을 사용하는 동일한 시스템의 동일한 디렉토리에 있습니다. 파일을 열고 쓰는 코드는 "프로덕션"코드의 디버그 인쇄 문을 제외하고는 테스트 코드의 정확한 복제본입니다.
cfgfile = open(file, 'w')
cfgfile = open(file, 'r')
cfgfile = open(file, 'wb')
하지만 난 내 생산 파일의 테스트 코드를 포함하면 나는 즉시 그것을 완전히의 파일을 지워 버리고 그 라인 안타, 사용 하나없이 :
나는 등의 다양한 방법을 시도 내 테스트 파일처럼 업데이트하는 것에 반대합니다. 여기 내가 그것을 호출 코드의 pertenent 라인입니다 :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
내가 다른 가져 오기가 아마 오픈 (파일, 'w')와 충돌 함께 할 수있는 뭔가가있을 것으로 생각한다.
내 주요 모듈은 pool_fill_control.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
을, 그 다음 코드 줄을 사용하여 위에 표시된 내 pool_sensors.py 모듈을 호출
get_pool_level = pool_sensors.get_pool_level_resistance()
왜 어떤 방식으로 작동하는지, 다른 방식으로 작동하지 않는지에 대한 도움은 크게 감사하겠습니다.
참고 : 더 나은 해결책은 원본과 같은 디렉토리에 새로운 'tempfile.NamedTemporaryFile'을'열면'os.replace를 사용하여 새로운 파일을 원자 적으로 이전 파일로 옮길 수 있습니다. 코드에 스레드가 포함되어 있거나 새 설정을 쓰는 동안 예외가 발생할 수있는 경우 데이터가 손상 될 위험이 없습니다. 당신은 어느 쪽도 성공하고, 원자 적으로 낡은 것을 새로운 것으로 바꾸거나 실패하고, 오래된 파일은 그대로 남습니다. – ShadowRanger
@ShadowRanger - 좋은 생각 인 것 같습니다. 설정 파일의 내용을 읽고, 메모리 (config.set)의 설정 파일을 변경 한 다음 새 임시 파일을 열고, config.write (tempfile.NamedTemporaryFile) 파일에 config를 쓰고, 그 파일을 닫은 다음 os.replace를 사용하여 원본 파일을 덮어 쓰거나 매번 처음부터 설정 파일을 다시 만들어야합니까? – Richard
해결책은 "처음부터 재생성"하는 것입니다. 이 업데이트를 수행 할 때마다 완전히 새로운 파일이 작성되지만, 자주 다시 작성하지 않으면 큰 문제가되지 않습니다. 설명하는 프로세스와 다른 "처음부터 다시 만들다"는 의미가 확실하지 않습니다. – ShadowRanger