为什么我的 python 无限循环休眠脚本会停止 运行?
Why does my python script with sleep in infinite loop stop running?
我正在编写一个 python 脚本来将数据从 .xlsx 文件传输到 html:我 read/parse excel 和 pandas 并使用 beautifulsoup 编辑 html(从两个 .txt 文件中读取这两个文件的路径)。这本身就有效。但是,此脚本必须 运行 不断地 因此所有内容都会在无限 while
中调用,每 15 分钟循环一次,每次都会在控制台上显示消息。
我的问题如下:出于某种原因,经过任意次数的循环后,代码不再 运行,我的意思是控制台上没有文本,也没有任何变化html 文件。发生这种情况时,我必须重新运行它才能使其再次运行。
这是主要功能:
def mainFunction():
if getattr(sys, 'frozen', False):
application_path = os.path.dirname(sys.executable)
elif __file__:
application_path = os.path.dirname(__file__)
excelFiles = open(str(application_path) +"\pathsToExcels.txt")
htmlFiles = open(str(application_path) +"\pathsToHTMLs.txt")
sheetFiles = open(str(application_path) +"\sheetNames.txt")
print("Reading file paths ...")
linesEx = excelFiles.readlines()
linesHtml = htmlFiles.readlines()
linesSheet = sheetFiles.readlines()
print("Begining transfer")
for i in range (len(linesEx)):
excel = linesEx[i].strip()
html = linesHtml[i].strip()
sheet = linesSheet[i].strip()
print("Transfering data for " + sheet)
updater = UpdateHtml(excel, sheet, str(application_path) + "\pageTemplate.html", html)
updater.refreshTable()
updater.addData()
updater.saveHtml()
print("Transfer done")
excelFiles.close()
htmlFiles.close()
sheetFiles.close()
UpdateHtml 是实际负责数据传输的人。
"__main__"
也包含while循环:
if __name__ == "__main__":
while(True):
print("Update at " + str(datetime.now()))
mainFunction()
print("Next update in 15 minutes\n")
time.sleep(900)
最后,启动这个的批处理代码
python "C:\Users\Me\PythonScripts\excelToHtmlTransfer.py"
pause
根据我通过试验注意到的情况,当 sleep
设置为 5 分钟以下(仍会发生 5 分钟)或完全省略时,不会出现这种情况。
有人知道为什么会发生这种情况吗?或者在这种情况下 sleep
的任何替代方案?
编辑:UpdateHtml:
import pandas as pd
from bs4 import BeautifulSoup
class UpdateHtml:
def __init__(self, pathToExcel, sheetName, pathToHtml, pathToFinalHtml):
with open(pathToHtml, "r") as htmlFile:
self.soup = BeautifulSoup(htmlFile.read(), features="html.parser")
self.df = pd.read_excel (pathToExcel, sheet_name=sheetName)
self.html = pathToFinalHtml
self.sheet = sheetName
def refreshTable(self):
#deletes the inner html of all table cells
for i in range(0, 9):
td = self.soup.find(id = 'ok' + str(i))
td.string = ''
td = self.soup.find(id = 'acc' + str(i))
td.string = ''
td = self.soup.find(id = 'nok' + str(i))
td.string = ''
td = self.soup.find(id = 'problem' + str(i))
td.string = ''
def prepareData(self):
#changes the names of columns according to their data
counter = 0
column_names = {}
for column in self.df.columns:
if 'OK' == str(self.df[column].values[6]):
column_names[self.df.columns[counter]] = 'ok'
elif 'Acumulate' == str(self.df[column].values[6]):
column_names[self.df.columns[counter]] = 'acc'
elif 'NOK' == str(self.df[column].values[6]):
column_names[self.df.columns[counter]] = 'nok'
elif 'Problem Description' == str(self.df[column].values[7]):
column_names[self.df.columns[counter]] = 'prob'
counter += 1
self.df.rename(columns = column_names, inplace=True)
def saveHtml(self):
with open(self.html, "w") as htmlFile:
htmlFile.write(self.soup.prettify())
def addData(self):
groupCounter = 0
index = 0
self.prepareData()
for i in range(8, 40):
#Check if we have a valid value in the ok column
if pd.notna(self.df['ok'].values[i]) and str(self.df['ok'].values[i]) != "0":
td = self.soup.find(id = 'ok' + str(index))
td.string = str(self.df['ok'].values[i])
#Check if we have a valid value in the accumulate column
if pd.notna(self.df['acc'].values[i]) and str(self.df['acc'].values[i]) != "0":
td = self.soup.find(id = 'acc' + str(index))
td.string = str(self.df['acc'].values[i])
#Check if we have a valid value in the nok column
if pd.notna(self.df['nok'].values[i]) and str(self.df['nok'].values[i]) != "0":
td = self.soup.find(id = 'nok' + str(index))
td.string = str(self.df['nok'].values[i])
#Check if we have a valid value in the problem column
if pd.notna(self.df['prob'].values[i]):
td = self.soup.find(id = 'problem' + str(index))
td.string = str(self.df['prob'].values[i])
if groupCounter == 3:
index += 1
groupCounter = 0
else:
groupCounter += 1
我正在使用的 excel 有点奇怪,因此我执行了这么多(看似)冗余的操作。不过,它必须保持目前的形式。
最主要的是包含数据的 'rows' 实际上是由 4 个常规行组成的,因此需要 groupCounter
.
找到解决此问题的方法。基本上我所做的是在批处理脚本中移动循环,如下所示:
:whileLoop
python "C:\Users\Me\PythonScripts\excelToHtmlTransfer.py"
timeout /t 900 /nobreak
goto :whileLoop
将它留给 运行 几个小时后,这种情况不再发生,但不幸的是,我仍然不知道是什么原因造成的。
我正在编写一个 python 脚本来将数据从 .xlsx 文件传输到 html:我 read/parse excel 和 pandas 并使用 beautifulsoup 编辑 html(从两个 .txt 文件中读取这两个文件的路径)。这本身就有效。但是,此脚本必须 运行 不断地 因此所有内容都会在无限 while
中调用,每 15 分钟循环一次,每次都会在控制台上显示消息。
我的问题如下:出于某种原因,经过任意次数的循环后,代码不再 运行,我的意思是控制台上没有文本,也没有任何变化html 文件。发生这种情况时,我必须重新运行它才能使其再次运行。
这是主要功能:
def mainFunction():
if getattr(sys, 'frozen', False):
application_path = os.path.dirname(sys.executable)
elif __file__:
application_path = os.path.dirname(__file__)
excelFiles = open(str(application_path) +"\pathsToExcels.txt")
htmlFiles = open(str(application_path) +"\pathsToHTMLs.txt")
sheetFiles = open(str(application_path) +"\sheetNames.txt")
print("Reading file paths ...")
linesEx = excelFiles.readlines()
linesHtml = htmlFiles.readlines()
linesSheet = sheetFiles.readlines()
print("Begining transfer")
for i in range (len(linesEx)):
excel = linesEx[i].strip()
html = linesHtml[i].strip()
sheet = linesSheet[i].strip()
print("Transfering data for " + sheet)
updater = UpdateHtml(excel, sheet, str(application_path) + "\pageTemplate.html", html)
updater.refreshTable()
updater.addData()
updater.saveHtml()
print("Transfer done")
excelFiles.close()
htmlFiles.close()
sheetFiles.close()
UpdateHtml 是实际负责数据传输的人。
"__main__"
也包含while循环:
if __name__ == "__main__":
while(True):
print("Update at " + str(datetime.now()))
mainFunction()
print("Next update in 15 minutes\n")
time.sleep(900)
最后,启动这个的批处理代码
python "C:\Users\Me\PythonScripts\excelToHtmlTransfer.py"
pause
根据我通过试验注意到的情况,当 sleep
设置为 5 分钟以下(仍会发生 5 分钟)或完全省略时,不会出现这种情况。
有人知道为什么会发生这种情况吗?或者在这种情况下 sleep
的任何替代方案?
编辑:UpdateHtml:
import pandas as pd
from bs4 import BeautifulSoup
class UpdateHtml:
def __init__(self, pathToExcel, sheetName, pathToHtml, pathToFinalHtml):
with open(pathToHtml, "r") as htmlFile:
self.soup = BeautifulSoup(htmlFile.read(), features="html.parser")
self.df = pd.read_excel (pathToExcel, sheet_name=sheetName)
self.html = pathToFinalHtml
self.sheet = sheetName
def refreshTable(self):
#deletes the inner html of all table cells
for i in range(0, 9):
td = self.soup.find(id = 'ok' + str(i))
td.string = ''
td = self.soup.find(id = 'acc' + str(i))
td.string = ''
td = self.soup.find(id = 'nok' + str(i))
td.string = ''
td = self.soup.find(id = 'problem' + str(i))
td.string = ''
def prepareData(self):
#changes the names of columns according to their data
counter = 0
column_names = {}
for column in self.df.columns:
if 'OK' == str(self.df[column].values[6]):
column_names[self.df.columns[counter]] = 'ok'
elif 'Acumulate' == str(self.df[column].values[6]):
column_names[self.df.columns[counter]] = 'acc'
elif 'NOK' == str(self.df[column].values[6]):
column_names[self.df.columns[counter]] = 'nok'
elif 'Problem Description' == str(self.df[column].values[7]):
column_names[self.df.columns[counter]] = 'prob'
counter += 1
self.df.rename(columns = column_names, inplace=True)
def saveHtml(self):
with open(self.html, "w") as htmlFile:
htmlFile.write(self.soup.prettify())
def addData(self):
groupCounter = 0
index = 0
self.prepareData()
for i in range(8, 40):
#Check if we have a valid value in the ok column
if pd.notna(self.df['ok'].values[i]) and str(self.df['ok'].values[i]) != "0":
td = self.soup.find(id = 'ok' + str(index))
td.string = str(self.df['ok'].values[i])
#Check if we have a valid value in the accumulate column
if pd.notna(self.df['acc'].values[i]) and str(self.df['acc'].values[i]) != "0":
td = self.soup.find(id = 'acc' + str(index))
td.string = str(self.df['acc'].values[i])
#Check if we have a valid value in the nok column
if pd.notna(self.df['nok'].values[i]) and str(self.df['nok'].values[i]) != "0":
td = self.soup.find(id = 'nok' + str(index))
td.string = str(self.df['nok'].values[i])
#Check if we have a valid value in the problem column
if pd.notna(self.df['prob'].values[i]):
td = self.soup.find(id = 'problem' + str(index))
td.string = str(self.df['prob'].values[i])
if groupCounter == 3:
index += 1
groupCounter = 0
else:
groupCounter += 1
我正在使用的 excel 有点奇怪,因此我执行了这么多(看似)冗余的操作。不过,它必须保持目前的形式。
最主要的是包含数据的 'rows' 实际上是由 4 个常规行组成的,因此需要 groupCounter
.
找到解决此问题的方法。基本上我所做的是在批处理脚本中移动循环,如下所示:
:whileLoop
python "C:\Users\Me\PythonScripts\excelToHtmlTransfer.py"
timeout /t 900 /nobreak
goto :whileLoop
将它留给 运行 几个小时后,这种情况不再发生,但不幸的是,我仍然不知道是什么原因造成的。