代码之家  ›  专栏  ›  技术社区  ›  user5915738 Paul Cornelius

如何在Python模块中嵌套c-api扩展并在该模块中使用它们?

  •  1
  • user5915738 Paul Cornelius  · 技术社区  · 7 年前

    我想创建一个名为“mypack”的Python 3包,它可以与pip一起安装。它有一些c扩展和一些调用这些扩展的python代码。这是我的目录结构:

    setup.py
    mypack/__init__.py
    mypack/mypack.py
    foopkg/foo.cpp
    

    设置。py文件具有以下代码:

    from setuptools import setup, Extension
    
    PACKAGE_NAME = 'mypack'
    
    module = Extension('foo',
                    language = "c++",
                    sources = ['foopkg/foo.cpp'])
    
    setup(name=PACKAGE_NAME,
          version='1.0',
          packages=[PACKAGE_NAME],
          ext_package=PACKAGE_NAME,
          ext_modules=[module],
          include_package_data=True)
    

    我根据另一个相关问题改编了这段代码,其中用户希望使用以下内容导入扩展: mypack.xxx make_array print_array

    ...
    
    static PyMethodDef FooMethods[] = {
        { "make_array", make_array, METH_VARARGS, "Put number in array"},
        { "print_array", print_array, METH_VARARGS, "Print number from array"},
        { NULL, NULL, 0, NULL}
    };
    
    static struct PyModuleDef foomodule = {
        PyModuleDef_HEAD_INIT,
        "foo",
        "Make/Print array",
        -1,
        FooMethods
    };
    
    PyMODINIT_FUNC PyInit_foo(void)
    {
        return PyModule_Create(&foomodule);
    }
    

    我希望能够在包中导入此扩展以使用它(这是 mypack.py ):

    import mypack.make_array
    import mypack.print_array
    
    def dostuff():
        array = make_array(10)
        print_array(array)
    

    __init__.py from .mypack import dostuff

    mypack 它抱怨中国的进口产品 我的背包。py公司 foo.xx mypack.xx . 我用嵌套结构构建了其他包,这些包使用模块中其他python文件的代码,使用 __初始化。py公司

    1 回复  |  直到 7 年前
        1
  •  0
  •   user5915738 Paul Cornelius    7 年前

    该模块是从C编译的,这一事实对编写import语句的方式没有影响。线路。。。

    import mypack.make_array
    

    如果将所有内容从 __init__.py 让它这样运作。如果您想改进导入语句的语法,可以稍后将内容添加到init文件中。你想要。。。

    from mypack.foo import make_array, print_array
    

    import mypack.foo as MYPACK
    

    在第一种情况下,方法现在位于全局命名空间中;在第二种情况下,您可以通过以下方式访问它们: MYPACK.make_array MYPACK.print_array .

    mypack 并命名python文件 mypack.py . 中只能有一个具有该名称的模块 一个包裹。一种解决方案是在C文件名前加下划线。然后在mypack中。比如你写的。。。

    from ._mypack import make_array
    

    这使得 make_array myarray ,客户端代码不必知道或关心它是用C编写的。