假如咱们要用C语言实现下面的python脚本bird.pypython
import os def fly(name): print(name + " is flying.\n")
调用脚本main.pylinux
import bird bird.fly("fwd")
执行效果以下windows
> python main.py fwd is flying.
实现相同逻辑的原始C代码bird.c多线程
#include <stdio.h> void fly(const char *name) { printf("%s is flying.\n", name); }
下面咱们要将原始C代码改形成能够被main.py的python模块:python2.7
#include <Python.h> #include <stdio.h> void fly(const char *name) { printf("%s is flying.\n", name); } static PyObject *bird_fly(PyObject *self, PyObject *args) { const char *name; if (!PyArg_ParseTuple(args, "s", &name)) return NULL; fly(name); Py_INCREF(Py_None); return Py_None; } static PyMethodDef bird_methods[] = { { "fly", bird_fly, METH_VARARGS, "Bird fly" }, { NULL, NULL, 0, NULL } }; PyMODINIT_FUNC initbird(void) { PyImport_AddModule("bird"); Py_InitModule("bird", bird_methods); }
# yum install -y python-devel # gcc -o bird.so `python-config --cflags` `python-config --libs` -shared bird.c ### 将main.py和bird.so放置在同一目录下 # python main.py fwd is flying.
VS2017(只需安装python2.7的64位版本便可,本地开发工具可不装)下建立空项目bird,而后添加源文件bird.cpp(内容同bird.c),项目配置以下:函数
Tab | 属性 | 值 |
---|---|---|
常规 | 常规 > 目标名称 | 将此字段设置为与 Python 看到的模块名称彻底匹配。 |
常规 | 常规 > 目标扩展名 | .pyd |
常规 | 项目默认值 > 配置类型 | 动态库(.dll) |
C/C++ > 常规 | 附加包含目录 | 根据相应的安装添加 Python include 文件夹,例如 C:\Python27amd64\include |
C/C++ > 预处理器 | 预处理器定义 | 在字符串的开头添加 Py_LIMITED_API; ,可限制可从 Python 调用的某些函数,并使代码在 Python 不一样版本之间更易于移植。 |
C/C++ > 代码生成 | 运行库 | 多线程 DLL (/MD)(请参阅下面的“警告”) |
连接器 > 常规 | 附加库目录 | 根据相应的安装添加包含 .lib 文件的 Python libs 文件夹,例如 C:\Python27amd64\libs 。 (务必指向包含 .lib 文件的 libs 文件夹,而非包含 .py 文件的 Lib 文件夹。) |
### 记住选择release + x64编译模式,不然编译dll会报错,而后将main.py和bird.pyd放置在同一目录下 bird\x64\Release> python main.py fwd is flying.