Windows10下VS2017+Python3.5.3运行Cython示例失败求助
我之前刚好在完全相同的环境(Win10、VS2017、Python3.5.3 x64)里成功跑通了Cython官方教程里的这三个基础示例,编译和导入都没遇到致命问题。你碰到的导入报错,大概率是几个容易忽略的细节没处理到位,咱们一步步来排查:
确认编译平台与Python位数严格匹配
虽然你明确用了64位Python,但VS2017默认打开的命令行工具可能是x86版本的。一定要打开「x64 Native Tools Command Prompt for VS 2017」来执行编译命令,这样生成的pyd文件才是64位的,能被你的Python识别。如果用错了32位工具集,哪怕编译成功,64位Python也会拒绝导入。检查setup.py的配置细节
以第一个示例为例,正确的setup.py应该是这样的:from distutils.core import setup from Cython.Build import cythonize setup( ext_modules = cythonize("hello.pyx") )要确保
cythonize()里指定的pyx文件名完全正确,没有拼写错误。如果是手动编译(不用setup.py),还要确认链接的Python库是64位版本的,路径应该指向Python35\libs\python35.lib(64位Python的库文件),而非x86版本的库。注意pyd文件的命名与导入方式
编译完成后,生成的pyd文件名应该类似hello.cp35-win_amd64.pyd(对应hello.pyx)。你导入的时候只需要写import hello,不要带后缀或者中间的版本/平台标识。如果手动修改过文件名,Python会找不到对应的模块。安装对应版本的VC运行时库
VS2017编译的Cython模块依赖VS2017版VC++ Redistributable(x64),如果你的系统没装这个,导入时会弹出「找不到指定dll」的错误。去微软官网下载对应版本的运行时库安装即可,务必选x64版本。从最简示例开始排查
先测试最基础的hello.pyx:只写一行print("Hello from Cython!"),用setup.py编译后尝试导入。如果这个能成功,再逐步测试后面的示例,排查是不是后面示例里的C语法、类型声明有隐性错误(有时候编译能通过,但导入时会触发问题)。
我当时就是严格按照这些步骤操作的,三个示例都顺利跑通了。你可以对照上面的点逐一排查,应该能解决导入问题。
内容的提问来源于stack exchange,提问作者Mikael

