Windows下构建Python Wheel文件权限/访问列表受限导致NSIS安装器无法读取的问题
听起来这个权限问题确实挺头疼的——Linux下一切正常,到Windows就因为文件权限卡壳了,尤其是NSIS安装器还读不了生成的Wheel文件。我之前也遇到过类似的Windows文件权限继承问题,给你几个实用的解决思路:
首先先确认问题根源:找到生成的.whl文件,右键点击→属性→安全选项卡,看看里面的权限列表,是不是只有创建它的进程/用户有访问权限,而NSIS安装器运行的用户(比如当前用户或者管理员)没有读取权限?如果是这样,那就是权限设置太严格导致的。
接下来给你几个具体的解决办法:
在CMake脚本里直接添加权限修改步骤
既然是CMake触发的Wheel构建和NSIS打包,那可以在Wheel生成完成后,用Windows自带的icacls命令给文件添加读取权限。比如在你的CMakeLists.txt里加一段自定义命令:# 假设你的Wheel文件生成路径是这个,根据实际情况调整 set(WHEEL_FILE_PATH "${CMAKE_BINARY_DIR}/dist/your_package-*.whl") add_custom_command(TARGET your_build_target POST_BUILD COMMAND icacls ${WHEEL_FILE_PATH} /grant Everyone:R /T COMMENT "Adding read permissions to wheel file for NSIS installer" )这里
Everyone:R是给所有用户开放读取权限,如果你想更严谨,可以换成具体的用户组(比如Administrators:R或者当前用户),不过给Everyone加读取权限在安装场景下通常是安全的。在Python打包环节修改文件权限
如果你是用setuptools或者build模块打包Wheel,可以在打包完成后用Python代码修改文件权限。比如在你的setup.py或者自定义的打包脚本里加一段:import os import stat from setuptools import setup import glob # 正常的setup配置... setup( # 你的包配置 ) # 打包完成后修改Wheel文件权限 def fix_wheel_permissions(): wheel_files = glob.glob("dist/*.whl") for wheel_path in wheel_files: current_mode = os.stat(wheel_path).st_mode # 添加组和其他用户的读取权限 os.chmod(wheel_path, current_mode | stat.S_IRGRP | stat.S_IROTH) fix_wheel_permissions()这样打包出来的Wheel文件就会有足够的读取权限了。
检查CMake构建目录的基础权限
有时候问题出在构建目录本身——如果你的CMake构建文件夹(比如build)权限设置得很严格,里面生成的所有文件都会继承这个权限。右键点击构建目录→属性→安全,确保当前用户和管理员组有读取、执行的权限,这样生成的Wheel文件也会继承合理的权限。调试验证步骤
先手动给生成的Wheel文件添加读取权限(右键→属性→安全→编辑→添加Everyone并勾选读取),然后再运行NSIS安装器,如果能正常读取,就确认是权限问题导致的,再针对性地用上面的方法解决。
另外还有个小细节:如果你是用管理员身份打开CLion运行CMake,生成的文件权限可能和普通用户运行时不一样,也可以试试用普通用户身份启动CLion再构建看看。
备注:内容来源于stack exchange,提问作者Fred

