WSL2编译Cython模块时出现“Operation not permitted”错误,但生成的.so文件可正常使用
WSL2编译Cython模块时出现“Operation not permitted”错误,但生成的.so文件可正常使用
看起来你遇到的是WSL2跨文件系统操作的权限兼容性问题,别担心,我们一步步拆解原因和解决办法:
首先聚焦错误核心:最后一步的copying build/.../m1_mod.cpython-310-x86_64-linux-gnu.so -> error: [Errno 1] Operation not permitted,说明.so模块已经在build目录里成功生成了,只是把文件复制到当前工作目录时触发了权限限制——你的工作目录在/mnt/c/...,也就是WSL2挂载的Windows NTFS分区目录,这是问题的根源。
为什么会出现这个问题?
WSL2对Windows NTFS文件系统的权限是模拟实现的,并不支持完整的Linux权限模型。默认挂载规则下,NTFS目录的权限位可能和Linux的文件操作预期不匹配,导致看似简单的复制操作被拒绝,而实际上编译出来的模块本身是没问题的。
解决办法
这里有两个实用的方案,你可以根据需求选择:
1. 迁移项目到WSL原生文件系统(最省心)
WSL的原生文件系统(比如/home/你的用户名/下的目录)完全支持Linux权限机制,不会出现这类跨系统的权限问题:
- 在WSL里创建项目目录:
mkdir -p ~/cython_demo - 把你的
m2_mod.pyx和m1_setup.py复制到这个目录 - 重新运行编译命令
python3 m1_setup.py build_ext --inplace,复制步骤就能正常完成了
2. 调整WSL挂载权限(如果必须在Windows目录工作)
如果坚持要在/mnt/c下开发,可以修改WSL的挂载配置,让NTFS目录的权限更贴合Linux预期:
- 在WSL里创建/编辑
/etc/wsl.conf文件:sudo nano /etc/wsl.conf - 添加以下配置内容:
[automount] options = "metadata,umask=0022,fmask=0022" - 保存后,在Windows的命令提示符/PowerShell里执行
wsl --shutdown关闭WSL,再重新打开WSL - 再次运行编译命令,复制操作就能正常执行了
额外小提示:消除Cython的FutureWarning
你看到的关于language_level的警告也可以轻松解决:
- 要么在
m2_mod.pyx的最顶部添加一行:# cython: language_level=3str - 要么在
m1_setup.py的cythonize方法里指定参数:setup(ext_modules = cythonize(["m2_mod.pyx"], compiler_directives={"language_level": "3str"}))
备注:内容来源于stack exchange,提问作者user2585330
相关产品推荐
相关产品推荐

