簡體   English   中英

如何將c-api擴展嵌套在Python模塊中並在該模塊中使用它們?

[英]How to nest c-api extensions in a Python module and use them in that module?

我想創建一個名為“ mypack”的Python 3程序包,可以通過pip進行安裝。 它具有一些c擴展名和一些調用這些擴展名的python代碼。 這是我的目錄結構:

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

setup.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這樣導入擴展名,就像我一樣。 在c-api擴展中,我已經成功地對其進行了編譯,並使它可以作為獨立的擴展模塊使用,但是在將其合並到較大的程序包中時遇到了麻煩。 它定義了兩個函數make_arrayprint_array 為了簡潔起見,我刪除了功能代碼,只包含了Python需要的內容:

...

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它抱怨在進口mypack.py ,不管我用foo.xxmypack.xx 我使用嵌套結構構建了其他軟件包,這些軟件包使用__init__.py和導入功能使用模塊中其他python文件的代碼。 但是我對如何使用c擴展名感到困惑。

從C編譯模塊的事實與編寫import語句的方式沒有區別。 線...

import mypack.make_array

嘗試導入在名為“ mypack”的程序包中找到的名為“ make_array”的模塊。 那不是你所擁有的。 您在名為“ mypack”的程序包中有一個名為“ foo”的模塊,並且在該模塊中有兩個名為“ make_array”和“ print_array”的對象(方法)。

如果從__init__.py刪除所有內容並使其以這種方式工作,則要簡單得多。 如果您想改善import語句的語法,可以稍后將內容添加到init文件中。 你要...

from mypack.foo import make_array, print_array

要么

import mypack.foo as MYPACK

在第一種情況下,這些方法現在位於全局名稱空間中。 在第二種情況下,您可以使用MYPACK.make_arrayMYPACK.print_array訪問它們。

我也看到命名您的C擴展名文件mypack和命名您的python文件mypack.py 包中只能有一個具有該名稱的模塊。 一種解決方案是在C文件名前加下划線。 然后例如在mypack.py中編寫...

from ._mypack import make_array

這會將make_array放入myarray的命名空間中,並且客戶端代碼不必知道或不在乎它是用C編寫的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM