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

2024-01-11

我想为一个不包含任何内容的项目创建一个包.py源文件,但是是完全作为 Python C 扩展实现(导致.so)。此外,假设.so已经由单独的构建过程构建(例如 CMake)。

我知道 setuptools/distutils 至少需要一个目录结构:

  • mymodule
    • __init__.py

但我真正想要的是mymodule由 C 扩展提供(例如mymodule.so)这样安装包后,import mymodule和直接导入效果一样mymodule.so.

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

  • mymodule
    • __init__.py
    • mymodule_native.so

并有__init__.py be:

from mymodule_native import *

这种工作方式,但是是一个对象A进口自mymodule实际上看起来像mymodule.mymodule_native.A.

有更直接的方法吗?


如果扩展是由 setuptools 配置的,则这是可能的。

例如:

from setuptools import setup, Extension

extension = Extension('mymodule', sources=[<..>])
setup('mymodule', ext_modules=[extension])

安装后,该扩展可用import mymodule。注意find_packages未使用。

这需要通过 setuptools 来完成,否则需要packages如果没有则设置ext_modules提供。

However,这使得.so模块直接安装在site-packages目录,并且会与同名的任何非扩展 python 模块发生冲突。

这通常被认为是不好的做法,大多数库使用裸Python模块和单个__init__.py,在该扩展名下可用。

例如,您将来可能会将 python 代码添加到您的模块中,并希望将纯 python 代码与扩展代码分开。或者您可能想要添加多个扩展,这是不可能的,至少在保持相同的包名称的情况下是不可能的。

所以像这样的结构mymodule.<python modules> and mymodule.my_extension说得通。

就我个人而言,我会对扩展代码与 python 代码有单独的名称空间,并且not do from <ext mod> import * in __init__.py.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为预构建的仅 C 扩展模块创建 Python 包 的相关文章

随机推荐

  • Django 无效的块标签:endelse 和 ifequal

    我想使用 djangoifequal and else判断变量是否等于的标签80 or 22 所以 这是代码 if firewalls thead tr th IP address th th Function th tr thead en
  • O(n) 算法找出出现次数超过 n/2 次的元素

    在一次采访中 有人要求我提供一个 O n 算法来打印在数组中出现超过 n 2 次的元素 如果存在这样的元素 n 是数组的大小 我不知道如何做到这一点 有人可以帮忙吗 这是博耶的投票算法 http www cs utexas edu moor
  • 按钮高度不一致(跨浏览器)

    我在设置按钮的高度时遇到问题 基本上我无法跨浏览器使用它 对于 Firefox 它高于normal 没有任何理由 这是一个屏幕截图 Firefox Safari 和 Opera 按此顺序 这里是代码 http jsfiddle net TM
  • 在 iOS 中绘制矩形

    我的应用程序的目标是让用户能够通过向左和向右滑动 iPhone 屏幕来对不同的日程安排选项进行排序 当用户对这些不同的调度选项进行排序时 我将如何绘制和删除矩形 我有一个 UIViewController h UIViewControlle
  • 通过文档文字 SOAP 发送 Base64 图像的替代方案

    我目前正在修改业务应用程序的文档文字 SOAP 服务 该应用程序前后传输有关客户的数据 刚刚确定了传输扫描文档图像的新要求 我遇到的问题是我使用的专有语言不支持 SOAP 附件 传输的图像可以是最大 32KB 的任何图像 我能想到的唯一解决
  • 获取产品的自定义选项值 magento 2

    我的产品有两个自定义选项 颜色和尺寸都是下拉菜单 在产品详细信息页面中 我必须显示该产品的所有可用颜色 我尝试了以下代码并且它有效 但它返回所有颜色和大小的值 但我只需要颜色值 那就是我想按颜色选择自定义选项 product block g
  • 在Windows中,2<&1和2>&1有什么区别?

    本页中的示例和解释让我感到困惑 http www microsoft com resources documentation windows xp all proddocs en us redirection mspx mfr true h
  • 等待 Kotlin 协程在 onCreateView() 中完成

    我有一个初始化块onCreateView 其中一些变量是从 SharedPreferences DB 或 Network 当前从 SharedPreferences 分配的 我想用这些值更新视图onViewCreated 但它们在协程之前更
  • 合并所有两个表但列数不同

    select count as total FROM SELECT FROM database1 orders WHERE number LIKE 11111111111111111 UNION ALL SELECT FROMdatabas
  • 信号会通过哪些方式干扰管道通信?

    我对信号一无所知 对管道也只有一点了解 从评论来看zdim s在这里回答 https stackoverflow com questions 48558093看来信号可能会干扰父进程和子进程之间的管道通信 有人告诉我 如果你使用IO Sel
  • 错误:(24, 11) 无法解析:com.android.support:appcompat-v7:8.0.+

    请帮助解决这个错误 因为这是我的第一个 Android 项目 摇篮同步 应用插件 com android application android compileSdkVersion 8 buildToolsVersion 23 0 2 de
  • 什么是对象切片?

    在 C 中 什么是对象切片以及它何时发生 切片 是将派生类的对象分配给基类的实例 从而丢失部分信息 其中一些信息被 切片 掉 例如 class A int foo class B public A int bar 所以一个类型的对象B有两个
  • Bootstrap 委托弹出内容回调触发两次

    我正在使用 Twitter Bootstrap 2 3 2 并且我正在注册一个弹出窗口 每当带有选择器的 td 悬停在上面时就会打开 但是我注意到在控制台中内容回调被触发两次 有没有办法防止这种情况发生 table data popover
  • Caffe 中的欧几里得损失层

    我目前正在尝试在 caffe 中实现我自己的损失层 在尝试这样做的同时 我使用其他层作为参考 然而 让我困惑的一件事是使用top 0 gt cpu diff in Backward cpu 我将使用EuclideanLossLayer作为参
  • ruby中的递归哈希转换函数

    我有以下响应模式的 swagger openAPI 定义 h type gt object properties gt books gt type gt array items gt type gt object properties gt
  • Heroku 无法验证 mongolab

    前两天已经修正了 昨天我对 heroku 做了一些更改 应用程序崩溃了 我发现heroku logs that app bundle gems ruby 1 9 1 gems mongo 1 4 0 lib mongo db rb 137
  • 客户多地址和默认地址的Mysql数据库设计

    我正在使用 Mysql 和 INNODB 引擎创建电子商务的数据库结构 Point 1 要为客户创建多个地址 我有这个表 我以正确的方式做吗 我应该如何存储默认地址 在哪个表中 Point 2 我有另一个名为 供应商 的表 我应该将其连接到
  • 在 Django 上的 Ajax 中重新加载整个页面?

    我正在使用 ajax 来执行该函数并检查该值是否已存在于数据库中 如果数据已经存在 我会显示 jQuery 对话框 该对话框工作正常 但如果该值尚不存在 我不想显示弹出窗口并刷新整个页面 这是我的 AJAX 函数 function copy
  • 无法在 spring-integration 4.1.x 中将 String 值转换为 ExpressionEvaluatingRequestHandlerAdvice 的表达式

    我无法让 ExpressionEvaluatingRequestHandlerAdvice 类在 Spring Integration 4 1 x 中工作 以下表达式建议上下文 XML 片段会产生一个转换错误 指出 Spring 无法将 o
  • 为预构建的仅 C 扩展模块创建 Python 包

    我想为一个不包含任何内容的项目创建一个包 py源文件 但是是完全作为 Python C 扩展实现 导致 so 此外 假设 so已经由单独的构建过程构建 例如 CMake 我知道 setuptools distutils 至少需要一个目录结构