簡體   English   中英

為什么我在無限循環中睡眠的 python 腳本停止運行?

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

我正在使用 python 腳本將數據從 .xlsx 文件傳輸到 html:我用 Pandas 讀取/解析 excel 並使用 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 有點奇怪,因此為什么我執行了這么多(看似)冗余操作。 盡管如此,它必須保持目前的形式。 最重要的是,包含數據的“行”實際上是由 4 個常規行組成的,因此需要groupCounter

找到了解決此問題的方法。 基本上我所做的是在批處理腳本中移動循環,如下所示:

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

讓它運行幾個小時后,這種情況不再發生,但不幸的是,我仍然不知道是什么原因造成的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM