You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 02:09:05