python c扩展
improt xxx时,python 会在一些路径中寻找:http://docs.python.org/2/tutorial/modules.html
When a module named spam is imported, the interpreter first searches for a built-in module with that name. If not found, it then searches for a file named spam.py in a list of directories given by the variable sys.path. sys.path is initialized from these locations:
- the directory containing the input script (or the current directory).
- PYTHONPATH (a list of directory names, with the same syntax as the shell variable PATH).
- the installation-dependent default.
After initialization, Python programs can modify sys.path. The directory containing the script being run is placed at the beginning of the search path, ahead of the standard library path. This means that scripts in that directory will be loaded instead of modules of the same name in the library directory. This is an error unless the replacement is intended. See sectionStandard Modules for more information.
在python shell下
import sys
sys.path
可以查看
python模块3种形式 如模块名字为helloworld:
helloworld.py
helloworld.pyc
helloworld.pyd(windows下的dll文件 只不过导出符号里有 inithelloworld 入口函数,用以初始化模块)
helloworld.so(unix下共享库,同window的dll)
写一个hello.c:
#include "Python.h" static PyObject* helloworld(PyObject* self) { return Py_BuildValue("s", "Hello, Python extensions!!"); } static char helloworld_docs[] = "helloworld( ): Any message you want to put here!!\n"; static PyMethodDef helloworld_funcs[] = { {"helloworld", (PyCFunction)helloworld, METH_NOARGS, helloworld_docs}, {NULL} }; __declspec(dllexport) void inithelloworld(void) { Py_InitModule3("helloworld", helloworld_funcs, "Extension module example!"); }
我们省去添加include路径的麻烦,直接把hello.c 放到 python 安装目录的 include 目录下
注意到 pthon27 的编译环境是vs2008
而python32 的编译环境是vs2010
这里用的是27,打开vs2008的命令提示控制台,切到 hello.c目录:
F:\Win7-app\Python27\include>cl.exe /c hello.c 用于 80x86 的 Microsoft (R) 32 位 C/C++ 优化编译器 15.00.21022.08 版 版权所有(C) Microsoft Corporation。保留所有权利。 hello.c F:\Win7-app\Python27\include>ls | grep hell hello.c hello.obj F:\Win7-app\Python27\include>link /dll hello.obj Microsoft (R) Incremental Linker Version 9.00.21022.08 Copyright (C) Microsoft Corporation. All rights reserved. LINK : fatal error LNK1104: 无法打开文件“python27.lib”
注意 /c 生成 只生成目标文件hello.obj
link时出错: 没有指定库路径 ,要链接 python27.lib
于是
F:\Win7-app\Python27\include>link /dll hello.obj /OUT:helloworld.dll/LIBPATH:../libs Microsoft (R) Incremental Linker Version 9.00.21022.08 Copyright (C) Microsoft Corporation. All rights reserved. 正在创建库 helloworld.lib 和对象 helloworld.exp F:\Win7-app\Python27\include>ls | grep hello hello.c hello.obj helloworld.dll helloworld.exp helloworld.lib
生成helloword.dll了,我们所helloworld.dll 后缀改为 .pyd 现在可以用这个 python库文件了:
Python 2.7.5 (default, May 15 2013, 22:43:36) [MSC v.1500 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import helloworld >>> dir(helloworld) ['__doc__', '__file__', '__name__', '__package__', 'helloworld'] >>> helloworld.helloworld() 'Hello, Python extensions!!' >>>
python为我们提供了 模块 distutilies.core 模块 构建安装 扩展模块:
http://www.cnblogs.com/threef/p/3290324.html
hello.c同目录下:写一个 setup.py
然后运行 python setup.py install
平台无关地构造安装扩展模块:
from distutils.core import setup,Extension setup(name='helloworld', version='1.0', \ ext_modules=[Extension('helloworld',['hello.c'])])