如何在setup.py中配置自动复制pyproj.libs等文件夹至lib目录?
解决方案
要自动复制pyproj.libs、scipy.libs、Shapely.libs这三个文件夹到输出目录的lib路径,你可以在PyInstaller的build_exe配置中添加include_files参数,通过动态获取包的安装路径来指定需要复制的文件夹。
步骤1:添加路径获取工具代码
在setup.py开头加入以下代码,用于自动定位各个包的.libs文件夹位置:
import os import importlib.metadata def get_libs_folder(package_name, libs_dir_name): # 获取目标包的安装目录 pkg_root = importlib.metadata.distribution(package_name).locate_file('') # 拼接得到.libs文件夹的完整路径 return os.path.join(pkg_root, libs_dir_name)
步骤2:更新build_exe配置
修改你的options字典,新增include_files项,指定要复制的源路径和目标路径:
# 提前获取三个.libs文件夹的路径 scipy_libs = get_libs_folder('scipy', 'scipy.libs') pyproj_libs = get_libs_folder('pyproj', 'pyproj.libs') shapely_libs = get_libs_folder('Shapely', 'Shapely.libs') options = { 'build_exe': { 'includes': [], 'packages': [ 'PyQt5', 'scipy', 'os', 'sys', 'datetime', 'pandas', 'scipy.spatial.distance', 'open3d', 'geopandas', 'laspy', 'numpy', 'alphashape', 'shapely.speedups' ], 'excludes': [ 'tkinter', 'matplotlib', 'sqlite3' ], # 配置自动复制的文件夹,格式为(源路径, 输出目录中的目标路径) 'include_files': [ (scipy_libs, 'lib/scipy.libs'), (pyproj_libs, 'lib/pyproj.libs'), (shapely_libs, 'lib/Shapely.libs') ] } }
关键说明
include_files中的元组第一个元素是本地系统里的源文件夹路径,第二个元素是相对于PyInstaller输出目录的目标路径,这里指定lib/xxx.libs会和你手动复制的位置完全一致。- 使用
importlib.metadata是Python 3.8+官方推荐的包路径获取方式,兼容性优于旧版的pkg_resources。 - 注意包名和文件夹名的大小写匹配(比如
Shapely首字母大写,对应Shapely.libs),避免路径定位错误。
内容的提问来源于stack exchange,提问作者Spatial Digger
相关产品推荐
相关产品推荐

