[英]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_array
和print_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.xx
或mypack.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_array
和MYPACK.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.