我想为一个不包含任何.py
源文件的项目创建一个包,但完全实现为Python C扩展(产生.so
)。另外,假设.so
已经由单独的构建过程构建(比如CMake)。
我知道setuptools / distutils最低限度需要一个目录结构:
但我真正想要的是mymodule
由C扩展名(例如mymodule.so
)提供,以便在安装包后,import mymodule
与直接导入{具有相同的效果{1}}。
我知道我可以拥有这种目录结构:
并mymodule.so
为:
__init__.py
此类工作,但从from mymodule_native import *
导入的对象A
实际上看起来像mymodule
。
有更直接的方法吗?
答案 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__.py
和mymodule.<python modules>
这样的结构很有意义。
我个人在扩展代码与python代码之间有单独的名称空间,而mymodule.my_extension
中的不是做from <ext mod> import *
。