pyinstaller 打包问题

我用OpenCV编写一个机器视觉小程序,在pycharm中可以运行,但用Pyinstaller 打包成EXE后,不能正常运行。
请教如何打包这样的程序!
我的环境是: PyInstaller: 4.5.1
Python: 3.7.2
windows-10-10.0.18362-SP0
OpenCv 4.2.0
用命令 pyinstaller -F mian.py 打包后,EXE运行,闪现错误代码后,黑窗口关闭。

我的代码如下:

import cv2
from cvzone.HandTrackingModule import HandDetector

cap = cv2.VideoCapture(0)
cap.set(3, 1280)
cap.set(4, 720)
detector = HandDetector(maxHands=1, detectionCon=0.8)

while True:
    success, img = cap.read()
    img = cv2.flip(img, 1)
    hands, img = detector.findHands(img, flipType=False)
    print(hands)

    if hands:
        hand = hands[0]
        lmList = hand['lmList']
        pointIndex = lmList[8][0:2]
        cv2.circle(img, tuple(pointIndex), 15, (255, 0, 0), cv2.FILLED)
        cv2.imshow('img', img)
    if cv2.waitKey(1) & 0xFF == 27:
        break

cap.release()
cv2.destroyAllWindows()

一下是运行后的信息:
Traceback (most recent call last):
File "main.py", line 7, in
File "cvzone\HandTrackingModule.py", line 35, in init
File "mediapipe\python\solutions\hands.py", line 129, in init
File "mediapipe\python\solution_base.py", line 265, in init
FileNotFoundError: The path does not exist.
[5496] Failed to execute script 'main' due to unhandled exception!
[ WARN:0] global C:\projects\opencv-python\opencv\modules\videoio\src\cap_msmf.cpp (674) SourceReaderCB::~SourceReaderCB terminating async callback
出现以上信息后黑窗口闪退
程序在pycharm中运行正常

曾也想用Nuitka打包,但未成功。希望有能够指点一下,不胜感谢!本人刚刚涉足机器视觉领域,不是很熟练,见笑了!

可参考: https://blog.csdn.net/weixin_49174552/article/details/125998896

该回答引用Chatgpt
请参考下面的解决方案,如果可行还请 点击 采纳 ,感谢!

问题1:用命令 pyinstaller -F mian.py 打包后,EXE运行,闪现错误代码后,黑窗口关闭
打包 OpenCV 程序的常见问题是找不到 OpenCV 的动态链接库。下面是一些解决办法:

1、使用 PyInstaller 时指定 OpenCV 库:在打包命令中加入 --hidden-import "cv2" 和 --add-data ";.",其中是 OpenCV 库的路径。
2、在代码中添加动态链接库路径:在代码的开头添加如下代码:

import sys
sys.path.append(r'<path to cv2.pyd>')

3、将 OpenCV 的 DLL 文件复制到打包后的 EXE 的目录中。
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
问题2 :运行报错

这个错误是由于mediapipe/python/solution_base.py文件265行的代码找不到某个路径导致的。你需要检查该路径是否存在,并确保代码正确地访问该路径。如果文件不存在,请将其添加到代码的正确路径中。

看样子是你打包时相关依赖没有打包进去,或者打包进去后,在代码中的引用路径的方式需要改变。你可以检查一下,打包后的目录中是否有生成你所用到的依赖库。如果不存在,可通过重新打包或者将该依赖手动复制进去看看。

您遇到的错误似乎是由于文件“cvzone\HandTrackingModule.py”的路径不存在所致。 这可能是由于文件路径不正确,或者文件在构建时未包含在包中。

以下是您可以尝试解决问题的方法:

确认文件“cvzone\HandTrackingModule.py”位于正确的目录中,并且它在 main.py 文件中的路径正确。

确保在使用 PyInstaller 构建包时包含所需的依赖项(OpenCV、mediapipe)。 您可以使用以下命令执行此操作:

pyinstaller -F --hidden-import="cv2" --hidden-import="mediapipe" main.py
尝试在 main.py 文件的开头添加以下代码行,以指定文件的基本路径:
import sys
sys.path.insert(0, "path_to_your_directory")
如果上述步骤均无效,请尝试使用其他工具(如 cx_Freeze)打包程序。

我希望这些步骤可以帮助您解决问题并成功打包您的程序。

通过错误信息来看,PyInstaller 打包后的程序无法找到文件“mediapipe\python\solutions\hands.py”,
很有可能是因为在打包时未包含这个文件。

一种解决办法是,使用 --hidden-import 参数把依赖模块包括进去,命令为:

pyinstaller -F --hidden-import mediapipe.python.solutions.hands main.py
如果用了還是報錯

可以尝试创建 spec 文件,在 spec 文件中指定依赖的文件。下面是示例:

生成 spec 文件:
pyinstaller --name=main --onefile main.py

生成之後 spec 文件,在 hiddenimports 部分加入依赖的文件:
-- mode: python ; coding: utf-8 --
block_cipher = None
a = Analysis(['main.py'],
pathex=['C:\Users\User\PycharmProjects\CVzone'],
binaries=[],
datas=[],
hiddenimports=['mediapipe.python.solutions.hands'],
hookspath=[],
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,
[],
exclude_binaries=True,
name='main',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
upx_alone=False,
cipher=block_cipher)
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
upx_exclude=[],
upx_alone=False,
name='main')

完成上面代碼後 即可打包
輸入
pyinstaller main.spec

按照上面的方法打包

这个问题可能是因为在代码中使用的 mediapipe 库的文件路径不存在,导致打包后的 EXE 文件在运行时无法找到这些文件。
解决方法有以下两种:
1.修改代码中的路径。在代码中找到使用到 mediapipe 库的文件路径,确保它们在打包后的 EXE 文件中可以正常使用。
2.在打包时使用 --onefile 参数,将所有文件打包到一个单独的文件中。命令如下:

pyinstaller -F --onefile main.py

如果仍然无法解决问题,可以考虑将打包后的 EXE 文件与所需的所有文件(包括 mediapipe 库文件)放在同一目录下,确保它们在同一路径下。

在 PyInstaller 的打包过程中,可能会遇到一些动态链接库和其他资源的缺失问题,造成程序运行异常。如果您的代码使用了第三方模块,请务必确保它们在打包后的可执行文件中能够找到,有必要的话需要使用 '--hidden-import
还有一种可能是,你的程序需要某些环境变量或其他系统设置,这些环境变量可能在打包后的环境中缺失。您可以通过研究代码和抛出的异常来更细致地了解究竟是什么导致了问题,并继续尝试解决它。

关于Nuitka:
安装Nuitka后执行以下命令来使用Nuitka打包Python代码:

nuitka --standalone --include-plugins=numpy --include-dependencies <python_file>.py

其中,是要打包的Python文件名。这会在当前目录下生成一个可执行文件。.py
可以使用以下命令以检查依赖关系:

nuitka --check-installed-modules <python_file>.py

如果需要打包的第三方包不在列表中,则需要使用选项打包这些包。--include-dependencies
更多关于Nuitka的详细使用说明,请访问官方文档:http://nuitka.net/doc/index.html%E3%80%82

打包的时候加入错误输出的参数,这样可以让你更好地看到错误信息,以便解决问题。
命令: pyinstaller -F main.py --log-level=DEBUG
也可以在程序中加入错误输出,以便在运行 EXE 文件时看到更多信息,如:

import cv2
from cvzone.HandTrackingModule import HandDetector
 
try:
    cap = cv2.VideoCapture(0)
    cap.set(3, 1280)
    cap.set(4, 720)
    detector = HandDetector(maxHands=1, detectionCon=0.8)
 
    while True:
        success, img = cap.read()
        img = cv2.flip(img, 1)
        hands, img = detector.findHands(img, flipType=False)
        print(hands)
 
        if hands:
            hand = hands[0]
            lmList = hand['lmList']
            pointIndex = lmList[8][0:2]
            cv2.circle(img, tuple(pointIndex), 15, (255, 0, 0), cv2.FILLED)
            cv2.imshow('img', img)
        if cv2.waitKey(1) & 0xFF == 27:
            break
 
    cap.release()
    cv2.destroyAllWindows()
except Exception as e:
    print(e)

虚拟环境和打包的环境不匹配

img


是你这个命令错误 还是你贴错了?
原【 pyinstaller -F mian.py 】,应为【 pyinstaller -F main.py 】

mediapipe 这个包

缺了相关依赖,或者没有打包进去

路径问题,建议软件中的地址用相对路径

终于解决问题了,谢谢大家!
pyinstaller打包时用上命令:Pyinstaller --add-data="C:\Users\Administrator\AppData\Local\Programs\Python\Python37\Lib\site-packages\mediapipe\modules;mediapipe/modules" -w main.py

mediapipe要添加到data资源下,而不是--hidden-import模块段中!!!!