我正在使用最新版本的 Python 和 Cython 在 Win 11 上开发 WSL-2。 我有一个非常小的程序 m2_mod.pyx,我想将其转换为 .so 文件以包含在主 Python 程序中:
from libc.math cimport pow
cdef float hypotenuse(float x, y):
return pow(x*x + y*y, 0.5)
cpdef print_hypotenuse(float x, y):
print("%4.3f, %4.3f, %4.3f" % (x, y, hypotenuse(x, y)) )
安装文件 m1_setup.py 是:
from setuptools import setup
from Cython.Build import cythonize
setup(ext_modules = cythonize(["m2_mod.pyx"]))
我运行
python3 m1_setup.py build_ext --inplace
创建一个扩展模块。输出如下所示。我插入了换行符以方便阅读。
Compiling m1_mod.pyx because it changed.
[1/1] Cythonizing m1_mod.pyx
/usr/local/lib/python3.10/dist-packages/Cython/Compiler/Main.py:381: FutureWarning: Cython directive 'language_level' not set, using '3str' for now (Py3). This has changed from earlier releases! File: /mnt/c/USR/Programming/Python/WI - Lic/wsl/use_cython/m1_mod.pyx
tree = Parsing.p_module(s, pxd, full_module_name)
running build_ext
building 'm1_mod' extension
creating build
creating build/temp.linux-x86_64-3.10
x86_64-linux-gnu-gcc -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -I/usr/include/python3.10 -c m1_mod.c -o build/temp.linux-x86_64-3.10/m1_mod.o
creating build/lib.linux-x86_64-3.10
x86_64-linux-gnu-gcc -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions -g -fwrapv -O2 -Wl,-Bsymbolic-functions -g -fwrapv -O2 -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 build/temp.linux-x86_64-3.10/m1_mod.o -o build/lib.linux-x86_64-3.10/m1_mod.cpython-310-x86_64-linux-gnu.so
copying build/lib.linux-x86_64-3.10/m1_mod.cpython-310-x86_64-linux-gnu.so ->
error: [Errno 1] Operation not permitted
即使该过程以错误消息结束,.c 和 .so 文件也已创建。 .so 文件可以“包含”在 Python 程序中,并且运行良好。我的问题是该错误消息是什么意思以及如何消除它?我进行了大量的网络搜索,但没有结果,非常感谢任何指导。不过,我是 WSL 新手。
我终于找到了为什么会出现错误消息的答案,并希望将其发布,以防其他人遇到同样的难题。
在 WSL-2(2024 年 12 月)中,命令行上的
wsl
命令以 root
用户身份启动 WSL,并且所有文件均归 root
所有。我使用 su <myname>
更改了用户并收到了错误消息。如果不将用户更改为 <myname>
,问题就会消失。
可以卸载
/mnt/c
,然后使用 <myname>
重新安装。这也将解决问题。