.pyx文件编译出错

以你之姓@ 2023-02-13 11:23 137阅读 0赞

文章目录

  • .pyx文件的编译
  • 导入

参考博客(写的超级好,完美解决了问题)

错误

  1. ImportError: Building module dtw failed: ["distutils.errors.CompileError: command 'D:\\\\Program Files (x86)\\\\Microsoft Visual Studio\\\\2019\\\\Preview\\\\VC\\\\Tools\\\\MSVC\\\\14.24.28314\\\\bin\\\\HostX86\\\\x64\\\\cl.exe' failed with exit status 2\n"]

天啦噜,这个问题花了半个多小时解决。虽然最后是解决了,但其实也不是很懂里面的原理,幸好网上有相关资料,不然真得花好多时间走更多弯路。

原来,.pyx文件在python语言中属于外部模块,因为是和C语言混合编译的,要成功使用这个模块的代码,在编译整个项目之前,需要首先把.pyx文件编译build通过,生成python代码;然后需要把生成的代码导入到项目中

.pyx文件的编译

我就是一直卡在这一步,我不知道怎么编译.pyx文件。原来,需要专门写一个setup.py模块,专用用于编译这个.pyx文件。

  1. from distutils.core import setup
  2. from Cython.Build import cythonize
  3. import numpy as np
  4. setup(
  5. ext_modules=cythonize('D:\\Users\\Administrator\\PycharmProjects\\dataAug\\venv\\Scripts\\src\\aaltd18-master\\distances\\dtw\\dtw.pyx'),
  6. include_dirs=[np.get_include()]
  7. )

然后,用setup.py编译。.pyx文件并不是直接执行setup.py就行的,需要使用命令,所以需要在命令行或者anaconda prompt中输入命令。

我之前一直没明白要用命令行,直接在pycharm中执行setup.py,出错

  1. import setup
  2. usage: [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
  3. or: --help [cmd1 cmd2 ...]
  4. or: --help-commands
  5. or: cmd --help
  6. error: no commands supplied

正确方法(使用anaconda prompt):

  1. (base) C:\Users\Administrator>d:
  2. (base) D:\>cd D:\Users\Administrator\PycharmProjects\dataAug\venv\Scripts\src\aaltd18-master\distances\dtw
  3. (base) D:\Users\Administrator\PycharmProjects\dataAug\venv\Scripts\src\aaltd18-master\distances\dtw>python setup.py build_ext --inplace
  4. running build_ext
  5. building 'dtw.dtw' extension
  6. creating build
  7. creating build\temp.win-amd64-3.7
  8. creating build\temp.win-amd64-3.7\Release
  9. creating build\temp.win-amd64-3.7\Release\Users
  10. creating build\temp.win-amd64-3.7\Release\Users\Administrator
  11. creating build\temp.win-amd64-3.7\Release\Users\Administrator\PycharmProjects
  12. creating build\temp.win-amd64-3.7\Release\Users\Administrator\PycharmProjects\dataAug
  13. creating build\temp.win-amd64-3.7\Release\Users\Administrator\PycharmProjects\dataAug\venv
  14. creating build\temp.win-amd64-3.7\Release\Users\Administrator\PycharmProjects\dataAug\venv\Scripts
  15. creating build\temp.win-amd64-3.7\Release\Users\Administrator\PycharmProjects\dataAug\venv\Scripts\src
  16. creating build\temp.win-amd64-3.7\Release\Users\Administrator\PycharmProjects\dataAug\venv\Scripts\src\aaltd18-master
  17. creating build\temp.win-amd64-3.7\Release\Users\Administrator\PycharmProjects\dataAug\venv\Scripts\src\aaltd18-master\distances
  18. creating build\temp.win-amd64-3.7\Release\Users\Administrator\PycharmProjects\dataAug\venv\Scripts\src\aaltd18-master\distances\dtw
  19. D:\Program Files (x86)\Microsoft Visual Studio\2019\Preview\VC\Tools\MSVC\14.24.28314\bin\HostX86\x64\cl.exe /c /nologo /Ox /W3 /GL /DNDEBUG /MT -ID:\ProgramData\Anaconda3\include -ID:\ProgramData\Anaconda3\include "-ID:\Program Files (x86)\Microsoft Visual Studio\2019\Preview\VC\Tools\MSVC\14.24.28314\ATLMFC\include" "-ID:\Program Files (x86)\Microsoft Visual Studio\2019\Preview\VC\Tools\MSVC\14.24.28314\include" "-IC:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\include\um" "-ID:\Windows Kits\10\include\10.0.18362.0\ucrt" "-ID:\Windows Kits\10\include\10.0.18362.0\shared" "-ID:\Windows Kits\10\include\10.0.18362.0\um" "-ID:\Windows Kits\10\include\10.0.18362.0\winrt" "-ID:\Windows Kits\10\include\10.0.18362.0\cppwinrt" /TcD:\Users\Administrator\PycharmProjects\dataAug\venv\Scripts\src\aaltd18-master\distances\dtw\dtw.c /Fobuild\temp.win-amd64-3.7\Release\Users\Administrator\PycharmProjects\dataAug\venv\Scripts\src\aaltd18-master\distances\dtw\dtw.obj
  20. dtw.c
  21. D:\Users\Administrator\PycharmProjects\dataAug\venv\Scripts\src\aaltd18-master\distances\dtw\dtw.c(612): fatal error C1083: 无法打开包括文件: numpy/arrayobject.h”: No such file or directory
  22. error: command 'D:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Preview\\VC\\Tools\\MSVC\\14.24.28314\\bin\\HostX86\\x64\\cl.exe' failed with exit status 2

出错是因为setup.py文件写的不对,下面是导致错误的setup.py版本:

  1. from distutils.core import setup
  2. from Cython.Build import cythonize
  3. setup(
  4. ext_modules=cythonize('D:\\Users\\Administrator\\PycharmProjects\\dataAug\\venv\\Scripts\\src\\aaltd18-master\\distances\\dtw\\dtw.pyx'),
  5. include_dirs=[np.get_include()]
  6. )

成功,生成了代码:

  1. (base) D:\Users\Administrator\PycharmProjects\dataAug\venv\Scripts\src\aaltd18-master\distances\dtw>python setup.py build_ext --inplace
  2. running build_ext
  3. building 'dtw.dtw' extension
  4. D:\Program Files (x86)\Microsoft Visual Studio\2019\Preview\VC\Tools\MSVC\14.24.28314\bin\HostX86\x64\cl.exe /c /nologo /Ox /W3 /GL /DNDEBUG /MT -ID:\ProgramData\Anaconda3\lib\site-packages\numpy\core\include -ID:\ProgramData\Anaconda3\include -ID:\ProgramData\Anaconda3\include "-ID:\Program Files (x86)\Microsoft Visual Studio\2019\Preview\VC\Tools\MSVC\14.24.28314\ATLMFC\include" "-ID:\Program Files (x86)\Microsoft Visual Studio\2019\Preview\VC\Tools\MSVC\14.24.28314\include" "-IC:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\include\um" "-ID:\Windows Kits\10\include\10.0.18362.0\ucrt" "-ID:\Windows Kits\10\include\10.0.18362.0\shared" "-ID:\Windows Kits\10\include\10.0.18362.0\um" "-ID:\Windows Kits\10\include\10.0.18362.0\winrt" "-ID:\Windows Kits\10\include\10.0.18362.0\cppwinrt" /TcD:\Users\Administrator\PycharmProjects\dataAug\venv\Scripts\src\aaltd18-master\distances\dtw\dtw.c /Fobuild\temp.win-amd64-3.7\Release\Users\Administrator\PycharmProjects\dataAug\venv\Scripts\src\aaltd18-master\distances\dtw\dtw.obj
  5. dtw.c
  6. D:\ProgramData\Anaconda3\lib\site-packages\numpy\core\include\numpy\npy_1_7_deprecated_api.h(14) : Warning Msg: Using deprecated NumPy API, disable it with #define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
  7. D:\Users\Administrator\PycharmProjects\dataAug\venv\Scripts\src\aaltd18-master\distances\dtw\dtw.c(2288): warning C4244: “=”: 从“Py_ssize_t”转换到“int”,可能丢失数据
  8. D:\Users\Administrator\PycharmProjects\dataAug\venv\Scripts\src\aaltd18-master\distances\dtw\dtw.c(2298): warning C4244: “=”: 从“Py_ssize_t”转换到“int”,可能丢失数据
  9. creating D:\Users\Administrator\PycharmProjects\dataAug\venv\Scripts\src\aaltd18-master\distances\dtw\dtw
  10. D:\Program Files (x86)\Microsoft Visual Studio\2019\Preview\VC\Tools\MSVC\14.24.28314\bin\HostX86\x64\link.exe /nologo /INCREMENTAL:NO /LTCG /nodefaultlib:libucrt.lib ucrt.lib /DLL /MANIFEST:EMBED,ID=2 /MANIFESTUAC:NO /LIBPATH:D:\ProgramData\Anaconda3\libs /LIBPATH:D:\ProgramData\Anaconda3\PCbuild\amd64 "/LIBPATH:D:\Program Files (x86)\Microsoft Visual Studio\2019\Preview\VC\Tools\MSVC\14.24.28314\ATLMFC\lib\x64" "/LIBPATH:D:\Program Files (x86)\Microsoft Visual Studio\2019\Preview\VC\Tools\MSVC\14.24.28314\lib\x64" "/LIBPATH:C:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\lib\um\x64" "/LIBPATH:D:\Windows Kits\10\lib\10.0.18362.0\ucrt\x64" "/LIBPATH:D:\Windows Kits\10\lib\10.0.18362.0\um\x64" /EXPORT:PyInit_dtw build\temp.win-amd64-3.7\Release\Users\Administrator\PycharmProjects\dataAug\venv\Scripts\src\aaltd18-master\distances\dtw\dtw.obj /OUT:D:\Users\Administrator\PycharmProjects\dataAug\venv\Scripts\src\aaltd18-master\distances\dtw\dtw\dtw.cp37-win_amd64.pyd /IMPLIB:build\temp.win-amd64-3.7\Release\Users\Administrator\PycharmProjects\dataAug\venv\Scripts\src\aaltd18-master\distances\dtw\dtw.cp37-win_amd64.lib
  11. 正在创建库 build\temp.win-amd64-3.7\Release\Users\Administrator\PycharmProjects\dataAug\venv\Scripts\src\aaltd18-master\distances\dtw\dtw.cp37-win_amd64.lib 和对象 build\temp.win-amd64-3.7\Release\Users\Administrator\PycharmProjects\dataAug\venv\Scripts\src\aaltd18-master\distances\dtw\dtw.cp37-win_amd64.exp
  12. 正在生成代码
  13. 已完成代码的生成

生成了.pyd文件,python外部模块
在这里插入图片描述
在这里插入图片描述

导入

这就简单了

直接在主代码main的首部加入

  1. import pyximport
  2. pyximport.install()

发表评论

表情:
评论列表 (有 0 条评论,137人围观)

还没有评论,来说两句吧...

相关阅读