Python 运行时间久了,def中的部分代码不执行,但是可以显示结果

用的python3.11
情况1:

from 查询全部待打印标签 import get_all_labels

def click_button(print_num):
    global text
# 问题在这里,调用了外部get_all_labels函数,在tkinter窗口打开一段时间后,再点击这个按钮,他不会运行这个函数了,直接快递的就return 
    trade_no_num = get_all_labels(print_num=print_num)
    text.insert(tk.END, f'本次打印了{trade_no_num}笔订单标签 \t{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}\n')

def thread_it(func, *args):
    t = threading.Thread(target=func, args=args)
    t.Daemon = True
    t.start()


Print_all_Button = tk.Button(root, text='全部标签打印', bg='#7CCD7C', width=20, height=5,
                             command=lambda: thread_it(click_button, 2))
Print_all_Button.pack()
text = tk.Text(root)
text.pack()
root.mainloop()

运行的结果:

img

情况2:

import hashlib
import urllib.parse
import time
from datetime import datetime, timedelta
import jsonpath
import openpyxl
import requests
import win32com.client



def print_label(trade_no, print_num):

    url_path = 'erp/opentrade/list/trades'

    query_time = get_time(back_6_day.year, back_6_day.month, back_6_day.day, tomorow.year, tomorow.month,
                          tomorow.day)
    # print(query_time)
    data = {
        '_app': appkey,
        '_t': _t,
        # 'bill_code': 'XD220808000014',
        "pay_time": query_time[0],
        'end_time': query_time[1],
        'limit': '200',
        'page': '1',
        'trade_status': '1,2,3,4',
        'is_split': '0'

    }

    _sign = hash_md5(joint(data, secretkey))

    data['_sign'] = _sign
    try:
        res = requests.post(url + url_path, data=data)
        # print(res.json())
        if res.status_code == 200:
            # print('post请求结果:', res.json())

            # 提取数据
            data = jsonpath.jsonpath(res.json(), '$..data')
            # print(data)
            data_list = []

            for i in data[0]:
                single_list = dict.fromkeys(
                    ['平台', '店铺名', '系统单号', '平台订单状态', '系统订单类型', '买家ID', '省', '市', '区',
                     '订单明细',
                     '快递名称', '快递单号', '是否组合商品', '是否拆分订单', '是否售后订单', '异常类型名称', '包裹重量',
                     '创建时间'])

                single_list['平台'] = jsonpath.jsonpath(i, '$..source_platform')
                single_list['店铺名'] = jsonpath.jsonpath(i, '$..shop_nick')
                single_list['系统单号'] = jsonpath.jsonpath(i, '$..trade_no')
                single_list['平台订单状态'] = jsonpath.jsonpath(i, '$..oln_status')
                single_list['系统订单类型'] = jsonpath.jsonpath(i, '$..trade_type')
                single_list['买家ID'] = jsonpath.jsonpath(i, '$..buyer')

            # ================================= 通过系统单号获取需要打印标签的组合商品名称 =================================#
            query_Trade_No = trade_no
            res = {'msg': '', 'id': ''}
            # 定义组合名称列表
            package_name = []
            a = 0
            for i in data_list:

                if query_Trade_No in i.get('系统单号')[0]:
                    a += 1  # 判断系统单号是否存在
                    orders = i.get('订单明细')[0]
                    # print(orders)
                    for order in orders:
                        item_name = order.get('item_name')  # 商品名称
                        sku_code = order.get('sku_code')  # 规格编码
                        size = order.get('size')  # 商品数量
                        price = order.get('price')  # 单价(商品标价)
                        is_package = order.get('is_package')  # 是否组合商品
                        receivable = order.get('receivable')  # 应收(原价)
                        order_total_discount = order.get('order_total_discount')  # 商品总优惠=原价-销售金额
                        payment = order.get('payment')  # 应收款
                        tp_tid = order.get('tp_tid')  # 线上单号
                        oln_item_id = order.get('oln_item_id')  # 线上商品id
                        if not sku_code:
                            sku_code = '0'
                        if not oln_sku_id:
                            oln_sku_id = '0'
                        if 'A0' in sku_code or 'A0' in oln_sku_id:
                            if oln_sku_name:
                                res0 = oln_sku_name.strip('颜色分类:')
                                res1 = res0.strip('尺寸:')
                                res2 = res1.strip('5套起拍;')
                                res3 = res2.strip(';')
                                res4 = res3.strip('规格:')
                                package_name.append(res4)
                            elif item_name:
                                res0 = item_name.strip('颜色分类:')
                                res1 = res0.strip('尺寸:')
                                res2 = res1.strip('5套起拍;')
                                res3 = res2.strip(';')
                                res4 = res3.strip('规格:')
                                package_name.append(res4)
                            else:
                                res['msg'] = '该买家没有组合商品!'
                                break

            if not package_name:
                if a > 0:
                    res['msg'] = '该买家没有组合商品!'
                else:
                    res['msg'] = '系统单号不正确!'
                # print('通过系统单号查找的组合名称:', package_name)
            else:
                res['msg'] = '打印完成!'

            for m in package_name:
                # 读取excel文件,获取workbook对象
                wb = openpyxl.load_workbook('E:/吊牌打印.xlsm', keep_vba=True)
                # 通过名称获取工作薄
                sheet = wb.active
                # 插入一行数据
                # sheet.append(["Hello", "World"])
                # 具体修改哪一行那一列的数据
                # 注意:cell的参数row、column必须是大于等于1的。
                # sheet.cell(1, 5).value = '菁娇微景观'
                sheet['B3'] = m
                sheet['B2'] = len(package_name)
                wb.save('E:/吊牌打印.xlsm')
                wb.close()
                xl = win32com.client.Dispatch("Excel.Application")
                xl.Workbooks.Open(Filename=r"E:\吊牌打印.xlsm")
                xl.Application.DisplayAlerts = False
                for count in range(int(print_num)):
                    xl.Application.Run("打印标签")
                # xl.Application.Save()
                # xl.Application.DisplayAlerts = True
                xl.Application.Quit()
                time.sleep(0.3)
    except:
        pass
    return res


if __name__ == '__main__':
    while True:
        trade_no_iput = input('请输入系统单号:')
        print_label(trade_no=trade_no_iput, print_num=2)


出错的问题:运行这个py文件,他while True 不是一直在运行着呢?一开始执行代码可以的,然后过上十来分钟,同样的可以出现结果(结果和最后一次的结果一样),但是实际上没有执行代码,快速的就return了,正常执行代码要十来秒的,他这么快速的返回结果肯定是不正常的,而且后台看打印结果,确实没有执行呢

1、检查get_all_labels 函数
2、你使用了下面的语句,如果if条件状态不是200,语句没有任何处理,所以只要不是200就没下文了。print_label没有返回值,while无法开启下次循环。

    try:
        res = requests.post(url + url_path, data=data)
        # print(res.json())
        if res.status_code == 200:

参考GPT和自己的思路,这个问题可能是由于tkinter的运行机制引起的,如果主线程被长时间的计算/循环占用,将无法处理其他事件,包括在用户按下按键时执行单击按钮操作的事件。

为了解决这个问题,可以将长时间运行的代码放到后台线程中,以使主线程可以继续响应事件。您已经在代码中实现了一个名为 thread_it 的函数,该函数接受一个函数作为参数,使用 threading.Thread 在后台执行该函数。

所以可以使用该函数来执行 get_all_labels 函数,如下所示:

def click_button(print_num):
    global text
    thread_it(get_all_labels, print_num)
    text.insert(tk.END, f'本次打印了{trade_no_num}笔订单标签 \t{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}\n')

这样就将 get_all_labels 函数移动到后台线程中,以避免在主线程中执行过长时间。另外,为了确保在后台线程中执行的代码正确更新 GUI,必须使用线程安全的 GUI 操作。

在 tkinter 中,可以使用 tkinter.StringVar 或 tkinter.IntVar 等变量类型来存储 GUI 组件的值,并使用 set() 方法在后台线程中更新它们的值。

例如,您可以为文本框 text 创建一个 tkinter.StringVar 对象,并在 click_button 函数中使用 text.set() 方法来设置文本框的值。

def click_button(print_num):
    global text
    thread_it(get_all_labels, print_num)
    text.set(f'本次打印了{trade_no_num}笔订单标签 \t{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}\n')

这将确保在后台线程中更新文本框的值,并避免在主线程中执行任何长时间运行的代码。



```python
try:
    #code
except:
    #应该走这里了,把异常信息打印看下

```

线程被杀了?实际上推出了?debug打桩看看吧。是不是都没到哪里

该回答内容部分引用GPT,GPT_Pro更好的解决问题
python运行时间久了,def中的部分代码不会执行,但是可以显示出结果,一般可能是因为代码中出现了一些错误,或者是def中有一些无法执行的操作。

要解决这个问题,首先要明确这段代码的作用,是什么操作?再看看这段代码有没有什么错误?或者是不能执行的操作?

  1. 首先来看看这段代码的作用:
    从import get_all_labels导入函数,在函数click_button()中调用get_all_labels()函数,传入print_num参数,然后在text中插入trade_no_num的值;在函数thread_it()中创建线程t,并将click_button()函数和参数2传入t中执行;在Print_all_Button中调用thread_it()函数。

  2. 接下来来看看这段代码有没有什么错误:
    第2行和第3行之间没有任何内容;在第6行的变量trade_no_num的赋值语句中少了个“=”号;在第9行的thread_it()函数的定义中少了个","号。

  3. 还有不能执行的操作:
    在Print_all_Button中调用thread_it()函数时,传入的参数是click_button()和2,但是click_button()函数需要传入print_num参数才能正常执行。

修改后的代码如下:

from 查询全部待打印标签 import get_all 1abels

def click_button(print_num):
    global text
    trade_no_num = get_all_labels(print_num=print_num)
    text.insert(tk.END,trade_no_num) 
    
def thread it(func,*args): 
    t = threading.Thread(target=func,args=args) 
    t.daemon = True 
    t.start() 
    
Print_al1_Button = tk.Button(root,text="",bg="",width=286,height-5,command=lambda: thread_it(click_button,2,print_num)) 
Print_all_Button.pack() 
text = tk.TextCroot 

如果回答有帮助,望采纳。

该回答引用GPTᴼᴾᴱᴺᴬᴵ
看起来是一个Python程序,定义了一个函数print_label(trade_no, print_num),它接受两个参数:trade_no(一个字符串)和print_num(一个整数)。程序导入了几个模块,包括hashlib、urllib、time、datetime、jsonpath、openpyxl、requests和win32com.client。
-
在函数内部,定义了几个变量:url_path、query_time、data和_sign。然后,函数使用提供的数据发送一个POST请求到指定的URL,使用requests模块,其中包括_app、_t、pay_time、end_time、limit、page、trade_status和is_split参数。_sign参数使用hash_md5函数计算,并在发送请求之前包含在数据字典中。
-
如果响应状态码为200,则函数使用jsonpath模块从JSON响应中提取数据并将其分配给data_list。然后,函数遍历data_list中的每个元素,并检查trade_no参数是否是系统订单号(i.get('系统单号')[0])的子字符串。如果是,则将res4子字符串附加到package_name列表中。如果package_name列表中没有元素,则函数将res['msg']变量设置为'该买家没有组合商品!'。如果package_name列表中有元素,则函数将res['msg']变量设置为'打印完成!'。
-
最后,函数使用openpyxl模块加载Excel工作簿,并遍历工作簿中的每个工作表。如果工作表名称与package_name列表中的字符串匹配,则函数打印标签。如果工作表名称与package_name列表中的任何字符串都不匹配,则函数将res['id']变量设置为'组合名称不正确!'。

我先说说我的理解:第二张图片里面用了爬虫(您隐藏了一部分),第一张图片里面也会用图2里面的爬虫。虽然您检查了status_code,但时间一长,通常都是爬虫失效了,建议您在每次爬虫后查看详细返回结果。