如何在PyInstaller的spec文件中使用通用site-packages路径引用DLL
PyInstaller spec文件动态获取site-packages下DLL路径的方法
PyInstaller的spec文件本质是可执行的Python脚本,你可以直接用Python标准库动态拼接路径,完全不需要硬写绝对路径。推荐两种实现方式:
方案1:直接定位pyvjoy库路径(更精准,推荐)
直接通过模块查找定位pyvjoy的安装目录,避免多site-packages场景下找错路径:
首先在spec文件头部添加以下代码:
import importlib.util import os # 定位pyvjoy模块的安装根目录 pyvjoy_spec = importlib.util.find_spec("pyvjoy") if not pyvjoy_spec: raise RuntimeError("未检测到pyvjoy库,请先执行pip install pyvjoy安装") pyvjoy_root = os.path.dirname(pyvjoy_spec.origin) # 拼接得到DLL的完整路径 vjoy_dll_path = os.path.join(pyvjoy_root, "utils", "x64", "vJoyInterface.dll")
然后修改Analysis里的binaries配置:
binaries=[(vjoy_dll_path, ".")],
注:binaries项的格式为(源文件路径, 打包后存放的相对路径),这里写.表示打包后放到生成程序的根目录,和你原来的写法效果一致。
方案2:通用获取site-packages路径
如果你需要通用指向当前Python环境的site-packages目录,可以用标准库的site模块实现:
在spec文件头部添加以下代码:
import site import os # 获取当前环境的site-packages目录列表,取第一个生效路径 site_packages_dir = site.getsitepackages()[0] vjoy_dll_path = os.path.join(site_packages_dir, "pyvjoy", "utils", "x64", "vJoyInterface.dll")
再修改binaries配置即可,和方案1一致。
修改后你的完整Analysis配置示例:
a = Analysis(['eyecommand.py'], pathex=['.'], binaries=[(vjoy_dll_path, ".")], datas=added_files, hiddenimports=["skimage.filters.rank.core_cy_3d","pynput.keyboard._win32", "pynput.mouse._win32"], hookspath=[], runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=True)
内容的提问来源于stack exchange,提问作者willwade
相关产品推荐
相关产品推荐

