Open wangyexiang opened 1 year ago
Pyinstaller 打包的 numpy 不完整。
在 spec 模板中找到:
# 这是要额外复制的模块
manual_modules = []
for m in manual_modules:
if not find_spec(m): continue
src = dirname(find_spec(m).origin)
dst = m
datas.append((src, dst))
加入 numpy :
# 这是要额外复制的模块
manual_modules = ['numpy', ]
for m in manual_modules:
if not find_spec(m): continue
src = dirname(find_spec(m).origin)
dst = m
datas.append((src, dst))
感谢作者的回答,昨晚看你的博客回答里,找到了这个解决方法,目前numpy
没问题了。但对paddle
(百度飞桨)打包又出问题了,看错误提示,还是路径的问题,所以,我如法炮制把paddle也加入到manual_modules
中,运行打包好的程序时还是报错:
Traceback (most recent call last):
File "main.py", line 16, in <module>
File "E:\ANNTool\libs\modules\ui\__init__.py", line 9, in <module>
from .Mainwindow import Mainwindow
File "E:\ANNTool\libs\modules\ui\Mainwindow.py", line 17, in <module Mainwindow>
File "E:\ANNTool\libs\modules\ui\components\setmodelapplicationwidget.py", line 10, in <module setmodelapplicationwidget>
File "E:\ANNTool\libs\paddle\__init__.py", line 31, in <module>
from .framework import monkey_patch_variable
File "E:\ANNTool\libs\paddle\framework\__init__.py", line 17, in <module>
from . import random # noqa: F401
File "E:\ANNTool\libs\paddle\framework\random.py", line 17, in <module>
from paddle import fluid
File "E:\ANNTool\libs\paddle\fluid\__init__.py", line 36, in <module>
from . import framework
File "E:\ANNTool\libs\paddle\fluid\framework.py", line 35, in <module>
from . import core
File "E:\ANNTool\libs\paddle\fluid\core.py", line 394, in <module>
set_paddle_lib_path()
File "E:\ANNTool\libs\paddle\fluid\core.py", line 386, in set_paddle_lib_path
lib_dir = os.path.sep.join([site.USER_SITE, 'paddle', 'libs'])
TypeError: sequence item 0: expected str instance, NoneType found
请问一下,这是什么原因呢?
把 hook.py
改成这个试下:
import sys
from pathlib import Path
BASE_DIR = Path(__file__).parent
sys._MEIPASS= str(BASE_DIR / 'libs')
# 为所有已存在于 sys.path 中的路径都插入 libs ,加到 sys.path 中
# 让程序到 libs 文件夹查找依赖
for p in sys.path.copy():
relative_p = Path(p).relative_to(BASE_DIR)
new_p = BASE_DIR / 'libs' / relative_p
sys.path.insert(0, str(new_p))
sys.path.insert(0, str(BASE_DIR)) # 把运行文件所在的根目录排到第一位,优先从根目录查找依赖包
import site
site.USER_SITE = 'libs' # pyinstaller禁用了 USER_SITE 变量,但飞浆要用,那就手动添加上
目前的 pyinstaller 最新版本是 5.13,在下一个大版本(即 6.0 ),将加入这个功能,把所有非执行文件放到一个子文件夹中,到时候应该就不用这个项目了。
好的,明白了。感谢解答
我在
hello_main.py
文件中导入了pandas
,然后进行打包,报错如下:根据错误提示,好像是numpy中的C扩展接口的路径找不到(导入出错),请问,这种问题应该如何解决呢?