• 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.pathsys.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!!
    ";
    
    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-appPython27include>cl.exe /c hello.c
    用于 80x86 的 Microsoft (R) 32 位 C/C++ 优化编译器 15.00.21022.08 版
    版权所有(C) Microsoft Corporation。保留所有权利。
    
    hello.c
    
    F:Win7-appPython27include>ls | grep hell
    hello.c
    hello.obj
    
    F:Win7-appPython27include>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-appPython27include>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-appPython27include>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'])])
  • 相关阅读:
    【git】用STS向gitee上传工程及下载工程
    【git】使用git bash上传一个多目录项目到码云的全记录
    【git】使用git bash上传一个单目录项目到码云的全记录
    Git for Windows下载地址
    【Oralce语法】使用connect by,level,prior显示员工的等级关系
    【Oracle sqlplus】指定结果集的列宽度 使用命令"column 列名 format a列宽"
    Java中传入多个参数的写法
    SUSE Linux 的Zypper包管理器使用实例
    lsusb命令-在系统中显示有关USB设备信息
    如何使用nload实时监控网络带宽
  • 原文地址:https://www.cnblogs.com/threef/p/3354757.html
Copyright © 2020-2023  润新知