鱼C论坛

 找回密码
 立即注册
查看: 1907|回复: 11

[已解决]pyinstaller打包问题

[复制链接]
发表于 2023-7-18 08:42:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 wk012233 于 2023-7-18 10:04 编辑

py文件可以正常运行执行,打包成exe后就会报错,这是什么问题,用的pyinstaller打包
最佳答案
2023-7-18 11:50:00
wk012233 发表于 2023-7-18 10:10
pyinstaller --onefile --icon=img.ico --noconsole 1.py


确实有一些资源没有加载进去,按我的步骤操作即可解决:

1、执行 pyi-makespec 1.py

2、用文件编辑器(例如记事本)打开 1.spec,将以下内容复制过去直接全部覆盖掉里面的内容
# -*- mode: python ; coding: utf-8 -*-
import barcode
import os

block_cipher = None


a = Analysis(
    ['1.py'],
    pathex=[],
    binaries=[],
    datas=[(os.path.join(barcode.__path__[0], 'fonts'), 'barcode/fonts/')],
    hiddenimports=[],
    hookspath=[],
    hooksconfig={},
    runtime_hooks=[],
    excludes=[],
    win_no_prefer_redirects=False,
    win_private_assemblies=False,
    cipher=block_cipher,
    noarchive=False,
)
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)

exe = EXE(
    pyz,
    a.scripts,
    a.binaries,
    a.zipfiles,
    a.datas,
    [],
    name='1',
    debug=False,
    bootloader_ignore_signals=False,
    strip=False,
    upx=True,
    upx_exclude=[],
    runtime_tmpdir=None,
    console=False,
    disable_windowed_traceback=False,
    argv_emulation=False,
    target_arch=None,
    codesign_identity=None,
    entitlements_file=None,
    icon=['img.ico'],
)

3、执行 pyinstaller 1.spec 打包即可
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-18 08:42:29 | 显示全部楼层
标题:PyInstaller打包问题的解决方法

内容:

这个问题可能由很多原因导致,我将列举一些常见的解决方案:

1. **确保所有依赖都已经正确安装**:你的.py文件在本地环境运行时可能使用了一些库或者依赖,而这些库或者依赖在打包的时候没有正确的被包含进去。你可以通过 pyinstaller --onefile --hidden-import=库名 your_script.py 来尝试解决这个问题。

2. **检查代码中的相对路径**:在.py文件中,如果你使用相对路径访问文件或者目录,那么这个路径在转换为.exe后可能就找不到对应的位置了。你可以试着将所有的相对路径都改为绝对路径。

3. **运行时数据/文件**:如果你的程序在运行时需要访问某些数据或者文件(例如图像,文本文件等),那么你需要确保这些文件在打包后的.exe文件中仍然可以被访问。

4. **确认exe和运行环境的兼容性**:比如你在64位的环境下生成的exe文件,在32位的环境下可能会出现问题。

5. **查看打包的错误日志**:你可以在执行pyinstaller命令时添加 --debug 参数,这样可以看到更多的debug信息,可能有助于你定位问题。

希望这些信息能帮助你解决问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-18 08:42:34 | 显示全部楼层
出现在使用 PyInstaller 打包成可执行文件后出现错误的问题有很多可能原因。以下是一些常见的问题和解决方法:

1. 缺少依赖项:PyInstaller 不会自动将所有依赖项打包到可执行文件中。如果你的代码依赖于其他模块或库,需要手动指定这些依赖项。可以通过 --hidden-import 参数来告诉 PyInstaller 这些依赖项。例如:pyinstaller --hidden-import module_name script.py

2. 文件路径问题:在 Python 脚本中,通过相对路径访问文件时,路径可能不正确,导致打包后无法找到文件。确保文件路径的正确性,可以使用绝对路径或相对路径。

3. 动态加载模块:如果你的代码在运行时动态加载了模块,而 PyInstaller 在分析代码时无法检测到这些动态加载的模块,就需要手动指定这些模块。可以使用 --hidden-import 参数或者创建一个 spec 文件来定义隐藏的导入项。

4. 缺少运行时环境:某些 Python 包需要在运行时才能正常工作,但这些包可能没有被正确地打包到可执行文件中。可以尝试使用 --exclude-module 参数来排除一些不必要的模块,或者使用 --add-data 参数将必要的文件复制到可执行文件所在的目录。

5. 缺少权限:在某些情况下,可执行文件可能没有足够的权限来读取或写入文件。尝试以管理员权限或以其他合适的权限运行可执行文件。

这些是一些常见的问题和解决方法。然而,具体的解决方法会因情况而异。如果你能提供更多错误信息、报错日志或详细的代码示例,我可以提供更具体的帮助。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-18 08:57:00 | 显示全部楼层
可能是你的Pygame程序有图片、文字等依赖。可以把你的exe和python文件放在同一个文件夹下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-18 09:05:16 | 显示全部楼层
本帖最后由 陈尚涵 于 2023-7-18 09:06 编辑

你说的报错是闪退吗,闪退是正常情况,因为程序运行的太快了,运行完就结束了,你可以在exe所在目录的文件打开cmd,然后在运行exe,看看结果,如果报错,此时也会显示出来,可以把报错发出来,想解决闪退问题可以在程序末尾添加input()这样可以等待用户输入然后退出
求最佳
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-18 09:40:09 From FishC Mobile | 显示全部楼层
你的报错如果是指闪退,请把程序的最后一行加上 input(),这样就好了,如果是其他问题,请告诉我
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-18 10:05:23 | 显示全部楼层
isdkz 发表于 2023-7-18 08:42
标题:PyInstaller打包问题的解决方法

内容:

是一个生成code128条码的程序,.py可以直接运行选择文件生成条码,但是打包之后选择文件点击生成就会提示:ERROR:root:处理内容时出现错误:423456789。错误信息:cannot open resource,该打包的库都打包进去了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-18 10:05:40 | 显示全部楼层
liuhongrun2022 发表于 2023-7-18 09:40
你的报错如果是指闪退,请把程序的最后一行加上 input(),这样就好了,如果是其他问题,请告诉我

是一个生成code128条码的程序,.py可以直接运行选择文件生成条码,但是打包之后选择文件点击生成就会提示:ERROR:root:处理内容时出现错误:423456789。错误信息:cannot open resource,该打包的库都打包进去了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-18 10:06:50 | 显示全部楼层
wk012233 发表于 2023-7-18 10:05
是一个生成code128条码的程序,.py可以直接运行选择文件生成条码,但是打包之后选择文件点击生成就会提示 ...

看起来是有一些资源没有打包进去,方便提供具体的代码吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-18 10:10:54 | 显示全部楼层
isdkz 发表于 2023-7-18 10:06
看起来是有一些资源没有打包进去,方便提供具体的代码吗?

pyinstaller --onefile --icon=img.ico --noconsole 1.py

import barcode    
import logging   
from barcode.codex import Code128
from barcode.writer import ImageWriter
from PIL import Image, ImageDraw, ImageFont      
import tkinter as tk                                             
from tkinter import filedialog, messagebox       
from pathlib import Path                         

def generate_barcode_image(url):
  
    bar = Code128(url, writer=ImageWriter())


    img = bar.render()
    img = img.rotate(0)  
    img = img.resize((img.width // 2, img.height // 2))  
    draw = ImageDraw.Draw(img)
    return img

def arrange_images(images_list, save_path):  
    A4_WIDTH_PIXELS = 2480   
    A4_HEIGHT_PIXELS = 3508   
    AQR_CODE_PADDING_LEFT = 120  
    AQR_CODE_PADDING_TOP = 200  

    image_count = len(images_list)
    for i in range(image_count):
        image = images_list[i]

    images_per_row = min(5, image_count)  
    rows = int(image_count / images_per_row) + int(bool(image_count % images_per_row)) 
    margin_left =150  
    margin_top = 150  

    a4_paper = Image.new("RGB", (A4_WIDTH_PIXELS, A4_HEIGHT_PIXELS), "white") 

    x_offset, y_offset = margin_left, margin_top  

    for i, image in enumerate(images_list):  
        image_path = image['path']   
        bar_code_img = Image.open(image_path) 
        resized_bar_code_img = bar_code_img.resize((400, 250)) 
        a4_paper.paste(resized_bar_code_img, (x_offset, y_offset))  

        if (i + 1) % images_per_row == 0:  
            x_offset = margin_left  
            y_offset += 300 + margin_top 
        else:
            x_offset += 300 + margin_left  

    a4_paper.save(save_path)  


def select_txt_files(): 
    txt_files_str = filedialog.askopenfilenames(filetypes=(("Text Files", "*.txt"), ("All files", "*.*")))  
    txt_files_entry.delete(0, tk.END) 
    txt_files_entry.insert(tk.END, ",".join(txt_files_str))   
    generate_button = tk.Button(frame1, text="生成条码",command=generate_bar_code)   
    generate_button.grid(row=0, column=3, padx=5)  

    return txt_files_str   

def generate_bar_code():  
    txt_file_paths = txt_files_entry.get().split(",")  
    barcode_images = []   
    counter = 1  

    for file_path in txt_file_paths: 
        with open(file_path, 'r', encoding='utf-8') as f:  
            lines = f.readlines()[:30]  

        for line in lines: 
            content = line.strip()   

            if not content:   
                continue

            try:  
                image_dict = {}   
                image_dict['url'] = content  
                image_dict['path'] = f"bar_code_{counter}.jpg" 

                img = generate_barcode_image(content)   
                img.save(image_dict['path'], "JPEG", quality=100) 

                barcode_images.append(image_dict)  
                counter += 1   
            except Exception as e:  
                logging.error(f"处理内容时出现错误:{content}。错误信息:{str(e)}")

    if len(barcode_images) > 0:  
        save_path = filedialog.asksaveasfilename(defaultextension='.jpg', filetypes=(("JPEG Files", "*.jpg"), ("All files", "*.*")))
        arrange_images(barcode_images, save_path) 
        messagebox.showinfo('完成', '条码生成完毕,打开图片查看吧~~') 

        for image_dict in barcode_images: 
            bar_code_file = image_dict['path'] 
            bar_code_path = Path(bar_code_file) 
            if bar_code_path.exists():  
                bar_code_path.unlink()  

    else:
        messagebox.showinfo('提示','TXT文件格式不正确,请确保文档内容不为空')
        


if __name__ == "__main__":   
    root = tk.Tk()
    root.title("批量生成条码")  

    frame1 = tk.Frame(root) 
    frame1.pack(pady=30)
 
    txt_label = tk.Label(frame1, text="要处理的TXT文件列表:") 
    txt_label.grid(row=0, column=0, padx=10)

    txt_files_entry = tk.Entry(frame1, width=80)
    txt_files_entry.grid(row=0, column=1, padx=10)

    txt_button = tk.Button(frame1, text="选择文件", command=select_txt_files)
    txt_button.grid(row=0, column=2, padx=10)
        

    root.mainloop()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-18 10:20:57 | 显示全部楼层
wk012233 发表于 2023-7-18 10:10
pyinstaller --onefile --icon=img.ico --noconsole 1.py

收到,我去试试什么问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-18 11:50:00 | 显示全部楼层    本楼为最佳答案   
wk012233 发表于 2023-7-18 10:10
pyinstaller --onefile --icon=img.ico --noconsole 1.py


确实有一些资源没有加载进去,按我的步骤操作即可解决:

1、执行 pyi-makespec 1.py

2、用文件编辑器(例如记事本)打开 1.spec,将以下内容复制过去直接全部覆盖掉里面的内容
# -*- mode: python ; coding: utf-8 -*-
import barcode
import os

block_cipher = None


a = Analysis(
    ['1.py'],
    pathex=[],
    binaries=[],
    datas=[(os.path.join(barcode.__path__[0], 'fonts'), 'barcode/fonts/')],
    hiddenimports=[],
    hookspath=[],
    hooksconfig={},
    runtime_hooks=[],
    excludes=[],
    win_no_prefer_redirects=False,
    win_private_assemblies=False,
    cipher=block_cipher,
    noarchive=False,
)
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)

exe = EXE(
    pyz,
    a.scripts,
    a.binaries,
    a.zipfiles,
    a.datas,
    [],
    name='1',
    debug=False,
    bootloader_ignore_signals=False,
    strip=False,
    upx=True,
    upx_exclude=[],
    runtime_tmpdir=None,
    console=False,
    disable_windowed_traceback=False,
    argv_emulation=False,
    target_arch=None,
    codesign_identity=None,
    entitlements_file=None,
    icon=['img.ico'],
)

3、执行 pyinstaller 1.spec 打包即可
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-22 11:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表