最近工作上遇到一个问题,某券商提供的文件单接口需要用其提供的c语言工具调用,由于我们的框架是python开发的,所以需要用到cython来调用c开发的工具包,学习了cython的官方入门教程并记录如下。

编写样例代码

编写一个后缀为pyx的函数cython_example.pyx

1
2
def say_hello_to(name):
print("Hello %s!" % name)

然后编写相应的编译脚本文件:

1
2
3
4
5
from distutils.core import setup
from Cython.Build import cythonize

setup(name='Hello world app',
ext_modules=cythonize("cython_example.pyx"))

编译代码

1
python setup.py build_ext --inplace

报如下错误:

1
2
3
running build_ext
building 'cython_example' extension
error: Unable to find vcvarsall.bat

Which Microsoft Visual C++ compiler to use with a specific Python version ?

visual c++ python
14.x 3.5,3.6,3.7,3.8
10.0 3.3,3.4
9.0 2.6, 2.7, 3.0, 3.1, 3.2

我使用的是python3.6,所以下载 Visual C++ 2015 Build Tools(包含Visual C++ 14.0)

下载地址:

http://go.microsoft.com/fwlink/?LinkId=691126&fixForIE=.exe.

安装之后重新执行编译命令输出如下最后两行说明编译通过:

1
2
Generating code
Finished generating code

会在当前目录下生成build目录和cython_example.cp36-win32.pyd

接下来做个测试,编写一个test.py,内容如下

1
2
3
import cython_example

cython_example.say_hello_to('eryk')

执行命令后输出如下结果说明调用cython函数成功了

1
Hello eryk!

参考

http://docs.cython.org/en/latest/src/quickstart/build.html

https://wiki.python.org/moin/WindowsCompilers

https://stackoverflow.com/questions/29846087/microsoft-visual-c-14-0-is-required-unable-to-find-vcvarsall-bat

我的微信公众号:pyquant