前言
cython是专门用来写在Python里面import用的扩展库。实际上Cython的语法基本上跟Python一致,而Cython有专门的“编译器”先将 Cython代码转变成C,然后使用C编译器编译出最终的Python可调用的模块。
本人因在github中找到了一份用cython写的自定义库函数代码,但无法直接运用到我所创建的pycharm编辑的项目文件中,因此为了实现在pycharm中py文件的代码调用,写了这篇文章。
一、pyx,pyd文件是什么?
pyx文件
pyx 文件是由 Cython 编程语言 “编写” 而成的 Python 扩展模块源代码文件。.pyx 文件要想被python语言直接识别,必须先被编译成 .c 文件,再编译成 .pyd 或 .so 文件,才可作为模块 import直接导入使用。
pyd文件
pyd 文件是非 Python,由其它编程语言 “编写-编译” 生成的 Python 扩展模块。Python 要导入 .pyd 文件,实际上是在 .pyd 文件中封装了一个 module。在 python 中使用时,把它当成 module 来用就可以了,即:“import 路径名.modulename” 即可,路径名为 .pyd 文件所在的路径。
介绍更加详细和全面的可以参考https://blog.csdn.net/qq_35608277/article/details/88937904
———————————————
二、使用步骤
1.安装对应的python平台和pycharm
在这里我使用的是python3.8和pycharm2020社区版(对于一般的来说够了)
2.创建编写对应的pyx文件
pycharm也可以直接创建编写pyx文件,但是在编写语法上需要按照cython格式去编写
创建pyx文件直接新建,后缀名为pyx即可
编写对应的SegmentImage.pyx文件,按照cython格式来,这里只是举个例子
3.编写对应的setup.py文件
setup.py文件的主要目的就是对pyx文件进行编译,然后生成pyd文件,方便在py文件中直接调用
代码如下:
代码如下(示例):
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
import numpy as np
filename = 'SegmentImage'
full_filename = 'SegmentImage.pyx'
ext_modules = [Extension(filename, [full_filename],
language='c++',
extra_compile_args=['-O3', '-march=native', '-ffast-math', '/openmp'],
extra_link_args=['/openmp'])]
setup(
cmdclass={
'build_ext': build_ext},
ext_modules=ext_modules,
include_dirs=[np.get_include()])
4.编译setup文件,生成pyd文件
编译setup文件时,不要直接运行setup.py,不然可能出现这样的错误‘no commands supplied’
这是因为python的run程序,相当于命令行里的python setup.py
所以若想要不报错,有两种方法
1、打开 pycharm的命令行模式,点pycharm 左下角的电脑方块图标,选中【Terminal】即可进入终端,输入命令: python setup.py install。
2、直接从cmd进入文件所在目录下输入令: python setup.py install
pyx成功编译后的界面如下
这样就完成了对pyx文件的成功编译,在py文件中直接调用对应的库文件就好
from SegmentImage import segmentImage
三、总结
总结起来就是步骤如下:
第一步安装对应的python和pycharm;第二步编写对应的pyx文件;第三步编写对应的setup文件;第四步生成pyd文件;第五步直接调用
参考博客:https://blog.csdn.net/u011418530/article/details/79986070
https://blog.csdn.net/ditai7533/article/details/101966350;https://blog.csdn.net/qq_35608277/article/details/88937904