cx_Freeze打包含GeoPandas的Python程序时找不到geos_c.dll问题求助
解决方法
1. 修改测试脚本test.py,在所有导入语句最前端添加运行时路径适配代码
# test.py 开头新增适配代码 import os import sys # 识别打包后的运行环境 if getattr(sys, 'frozen', False): # 获取exe文件所在的根目录 exe_root = os.path.dirname(sys.executable) # 将打包后的依赖库路径加到系统PATH最前面,优先读取本地依赖 os.environ['PATH'] = os.path.join(exe_root, 'lib') + os.pathsep + os.environ['PATH'] # 指定pyproj的资源文件路径,避免pyproj报错 os.environ['PROJ_LIB'] = os.path.join(exe_root, 'share', 'proj') # 原有导入语句放在适配代码之后 import numpy as np import geopandas as gpd from pyproj import _datadir, datadir print("Test script:") print(f"Executable {sys.executable}") print("Read numpy list") x = np.linspace(0, 10, 11) print(x)
2. 修改打包配置setup.py,添加缺失的地理空间依赖库文件
import cx_Freeze import sys import os PYTHON_INSTALL_DIR = os.path.dirname(sys.executable) # 新增:读取conda环境的Library目录,地理空间类依赖默认都存放在该路径下 CONDA_LIBRARY_DIR = os.path.join(PYTHON_INSTALL_DIR, 'Library') os.environ['TCL_LIBRARY'] = os.path.join(PYTHON_INSTALL_DIR, 'tcl', 'tcl8.6') os.environ['TK_LIBRARY'] = os.path.join(PYTHON_INSTALL_DIR, 'tcl', 'tk8.6') include_files = [ (os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tk86t.dll'), os.path.join('lib', 'tk86t.dll')), (os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tcl86t.dll'), os.path.join('lib', 'tcl86t.dll')), # 新增:自动拷贝geos_c.dll到打包后的lib目录 (os.path.join(CONDA_LIBRARY_DIR, 'bin', 'geos_c.dll'), os.path.join('lib', 'geos_c.dll')), # 新增:自动拷贝proj的全部资源文件到打包后的对应目录 (os.path.join(CONDA_LIBRARY_DIR, 'share', 'proj'), os.path.join('share', 'proj')) ] packages = ["numpy", "tkinter", "geopandas", "shapely", "fiona", "pyproj"] base = None if sys.platform == "win32": # 测试阶段可以注释掉下面这行,保留控制台窗口方便排查报错,确认运行正常后再恢复即可 base = "Win32GUI" executables = [cx_Freeze.Executable("test.py", base=base)] cx_Freeze.setup( name = "Network_Analyst", options = {"build_exe": {"packages":packages, "include_files":include_files}}, version = "0.1", description = "Network analyst", executables = executables )
3. 执行打包
先激活对应的conda test_env环境,再执行打包命令:python setup.py build
打包完成后直接运行build目录下生成的exe文件即可。
说明:之前手动拷贝dll到全局路径无效,是因为程序运行时优先读取conda环境编译时写入的硬编码路径,通过上述适配后程序会优先读取打包目录内的依赖文件,同时也支持打包后的程序拷贝到其他Windows设备运行。
内容的提问来源于stack exchange,提问作者3dSpatialUser
相关产品推荐
相关产品推荐

