为预构建的仅C扩展模块创建Python包

时间:2017-08-09 21:35:16

标签: python setuptools distutils

我想为一个不包含任何.py源文件的项目创建一个包,但完全实现为Python C扩展(产生.so )。另外,假设.so已经由单独的构建过程构建(比如CMake)。

我知道setuptools / distutils最低限度需要一个目录结构:

  • MyModule的
    • __初始化__。PY

但我真正想要的是mymodule由C扩展名(例如mymodule.so)提供,以便在安装包后,import mymodule与直接导入{具有相同的效果{1}}。

我知道我可以拥有这种目录结构:

  • MyModule的
    • __初始化__。PY
    • mymodule_native.so

mymodule.so为:

__init__.py

此类工作,但从from mymodule_native import * 导入的对象A实际上看起来像mymodule

有更直接的方法吗?

1 个答案:

答案 0 :(得分:1)

如果扩展名由setuptools配置,则可能。

例如:

DuplicateUsers <- duplicated(songsdata[,2:4])
DuplicateUsers <- songsdata[DuplicateUsers,]


DistinctSongs <- songsdata %>%
  distinct(sessionid, date_transaction, .keep_all = TRUE)

RareUsers <- anti_join(DistinctSongs, DuplicateUsers, by='sessionid')

安装后,扩展程序可用from setuptools import setup, Extension extension = Extension('mymodule', sources=[<..>]) setup('mymodule', ext_modules=[extension]) 。请注意,import mymodule未使用。

这需要由setuptools完成,否则如果没有提供find_packages则需要packages设置。

然而,这使得ext_modules模块直接安装在.so目录下,并且会与任何同名的非扩展python模块冲突。

这通常被认为是不好的做法,并且大多数库使用带有单个site-packages的裸python模块,在该模块下可以使用扩展名。

您可能在将来将python代码添加到您的模块中,并希望将纯Python代码与扩展代码分开。或者您可能希望添加多个以这种方式无法实现的扩展,至少在保持相同的包名时不会。

因此像__init__.pymymodule.<python modules>这样的结构很有意义。

我个人在扩展代码与python代码之间有单独的名称空间,而mymodule.my_extension中的不是from <ext mod> import *