简体   繁体   English

为什么我在无限循环中睡眠的 python 脚本停止运行?

[英]Why does my python script with sleep in infinite loop stop running?

I'm working on a python script to transfer data from an .xlsx file to a html: I read/parse the excel with pandas and use beautifulsoup to edit the html (reading the paths to these two files from two .txt's).我正在使用 python 脚本将数据从 .xlsx 文件传输到 html:我用 Pandas 读取/解析 excel 并使用 beautifulsoup 编辑 html(从两个 .txt 读取这两个文件的路径)。 This, on its own, works.这本身就有效。 However, this script has to run constantly so everything is called in an infinite while that loops every 15 minutes, each time messages being displayed on the console.然而,这个脚本有那么一切都被称为无限不断地运行while该循环每隔15分钟,被显示在控制台上每一次消息。

My problem is the following: for some reason, after an aleatoric number of loops, the code just doesn't run anymore, and by that I mean no text on the console and no changes in the html file.我的问题如下:出于某种原因,在任意数量的循环之后,代码不再运行,我的意思是控制台上没有文本,html 文件中没有任何更改。 When this happens, I have to rerun it in order to get it to function again.发生这种情况时,我必须重新运行它才能使其再次运行。

Here is the main function:这是主要功能:

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 is the one actually responsible for the data transfer. UpdateHtml是真正负责数据传输的。

The "__main__" which also contains the while loop: "__main__"也包含 while 循环:

if __name__ == "__main__":
    while(True):
        print("Update at " + str(datetime.now()))
        mainFunction()
        print("Next update in 15 minutes\n")
        time.sleep(900)

And finally, the batch code that launches this最后,启动这个的批处理代码

python "C:\Users\Me\PythonScripts\excelToHtmlTransfer.py"

pause

From what I've noticed through trials, this situation doesn't occur when sleep is set to under 5 minutes (still happens for 5 minutes) or if it's omitted altogether.从我通过试验注意到的情况来看,当sleep设置在 5 分钟以下(仍然会发生 5 分钟)或完全省略时,这种情况不会发生。

Does anyone have any clue why this might be happening?有谁知道为什么会发生这种情况? Or any alternatives to sleep in this context?或者在这种情况下sleep任何替代方案?

EDIT: UpdateHtml:编辑: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

The excel I'm working with is a bit strange hence why I perform so many (seemingly) redundant operations.我正在使用的 excel 有点奇怪,因此为什么我执行了这么多(看似)冗余操作。 Still, it has to remain in its current form.尽管如此,它必须保持目前的形式。 The main thing is the fact that the 'rows' that contain data is actually formed out of 4 regular rows, hence the need for groupCounter .最重要的是,包含数据的“行”实际上是由 4 个常规行组成的,因此需要groupCounter

Found a workaround for this problem.找到了解决此问题的方法。 Basically what I did was move the loop in the batch script, as so:基本上我所做的是在批处理脚本中移动循环,如下所示:

:whileLoop
python "C:\Users\Me\PythonScripts\excelToHtmlTransfer.py"
timeout /t 900 /nobreak
goto :whileLoop

After leaving it to run for a few hours the situation didn't occur anymore, however unfortunately I still don't know what caused it.让它运行几个小时后,这种情况不再发生,但不幸的是,我仍然不知道是什么原因造成的。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM