在setup.py中指定Windows专属DLL安装路径的正确方法是什么?
你当前硬编码lib\site-packages\fugashi\作为安装目标路径是失效的核心原因,这个路径是相对路径,无法适配所有Python环境:用户级安装、虚拟环境、conda环境、自定义安装路径的Python的site-packages位置都不是固定的,路径匹配失败时DLL就会被放到错误位置,导致加载失败。
以下是两种经过验证的可靠实现方案:
方案1:使用package_data(优先推荐)
package_data是setuptools专门设计用来随Python包分发配套文件的配置项,不需要手动指定安装路径,会自动将文件放到对应包的安装目录下,适配所有环境。
操作步骤:
- 确保你的DLL文件放在源码目录的
fugashi包目录下(可放置在子目录) - 修改
setup.py配置:
from setuptools import setup, find_packages setup( # 其他原有配置,比如name、version等 packages=find_packages(), # 或手动指定packages=["fugashi"] package_data={ # 键是包名,值是需要打包的文件匹配规则 "fugashi": ["*.dll"] }, # 如果你没有用MANIFEST.in配置其他文件,把include_package_data设为False避免冲突 include_package_data=False )
方案2:动态计算site-packages路径适配data_files
如果你必须沿用data_files的写法,不要硬编码路径,通过sysconfig模块动态获取当前环境的site-packages路径:
import os import sysconfig from setuptools import setup # 动态获取site-packages路径,purelib对应纯Python包,platlib对应带C扩展的包按需选择 site_pkg = sysconfig.get_path("purelib") dll_target = os.path.join(site_pkg, "fugashi") setup( # 其他原有配置 data_files=[(dll_target, [你的DLL文件路径列表])] )
额外运行时适配建议
Python 3.8及以上版本在Windows上加载DLL时默认不会搜索包目录,建议在fugashi包的__init__.py开头添加以下代码,保证运行时可以正常找到DLL:
import os import sys if sys.platform == "win32": pkg_dir = os.path.dirname(os.path.abspath(__file__)) os.add_dll_directory(pkg_dir)
内容的提问来源于stack exchange,提问作者polm23
相关产品推荐
相关产品推荐

