通过 cython 将 python 字符串传递给 C

2024-02-12

我正在尝试编写一个包含一些 c 和一些 python 部分的模块。我正在使用 cython 来弥补差距。

我想在 python 中存储我的(很长的)字符串常量,因为它有更好的语法:

const char long_string = "\npart of string\n"
  "next part\n"
  "last part\n";

versus:

long_string = """
part of string
next part
last part
"""

(字符串比这个长得多,而且更复杂 - 以至于我不想添加和删除"s and \n"每次我想用语法突出显示来编辑它时。事实上,它们是 openCL 内核。)

我需要能够使用 cython 将它们转换为 C 字符串,并根据文档 http://docs.cython.org/src/tutorial/strings.html我应该只需要这个:

cdef bytes py_bytes = py_string.encode()
cdef char* c_string = py_bytes

并且无需手动内存管理,c_string只要我保留引用就会起作用py_bytes.

但是,我无法通过简单的 printf 测试来实现这一点。这是我的 cython 文件:

cdef extern from "stdio.h":
  printf(char* string)

def go():
  py_string = """
a complicated string
with a few
newlines.
"""

  cdef bytes py_bytes = py_string.encode()

  cdef char* c_string = py_bytes

  printf(c_string)

  print "we don't get this far :("

当在运行时编译时使用pyximport在出现段错误之前,向终端提供以下输出:

a complicated string
with a few
newlines.
Segmentation fault: 11

现在,我已经检查了 cython 在 c 文件中实际放入的内容,并在普通 C 文件中尝试了它doesn't段错误:

#include "stdio.h"

static char __pyx_k_1[] = "\na complicated string\nwith a few\nnewlines.\n";

int main(void) {
  void* output = printf(__pyx_k_1);
  if (!output) {
    printf("apparently, !output.");
  }
}

需要明确的是,cython 生成的代码捕获以下输出printf并测试“不是那样”。变量的类型是PyObject*.

我唯一的猜测是字符串未正确终止,因此 printf 只是继续超出它的末尾并导致段错误,但由于这在我的纯 c 测试中不会发生,所以我完全被难住了。

所以,我真正的问题是我该如何really将 c 字符串从 cython 传递给 c 代码?非常欢迎指出解决我试图在顶部解决的实际问题的更简单方法的答案:)


输入printf from libc.stdio为我解决了问题:

from libc.stdio cimport printf

def go():
    py_string = """
a complicated string
with a few
newlines.
"""

    cdef bytes py_bytes = py_string.encode()
    cdef char* c_string = py_bytes
    printf(c_string)

    print "we actually got this far! :)"

错误是在声明中printf。本来应该是这样的stdio.pxd lists,

cdef extern from *:
    ctypedef char const_char "const char"

int printf(const_char *, ...)

而你的版本是隐式的object printf(char *);默认返回值类型是Python对象而不是int如 C 中所示。获得正确的声明会阻止 Cython 的尝试Py_XDECREF返回值来自printf.

(顺便说一句,在你的“普通”C 问题中,你不应该从printf to void *.)

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

通过 cython 将 python 字符串传递给 C 的相关文章

  • 告诉 Nancy 将枚举序列化为字符串

    Nancy 默认情况下在生成 JSON 响应时将枚举序列化为整数 我需要将枚举序列化为字符串 有一种方法可以通过创建来自定义 Nancy 的 JSON 序列化JavaScript 原始转换器 https github com NancyFx
  • 将 Long 转换为 DateTime 从 C# 日期到 Java 日期

    我一直尝试用Java读取二进制文件 而二进制文件是用C 编写的 其中一些数据包含日期时间数据 当 DateTime 数据写入文件 以二进制形式 时 它使用DateTime ToBinary on C 为了读取 DateTime 数据 它将首
  • 类型约束

    我有以下类层次结构 class Header IEnumerable
  • 识别 Visual Studio 中的重载运算符 (c++)

    有没有办法使用 Visual Studio 快速直观地识别 C 中的重载运算符 在我看来 C 中的一大问题是不知道您正在使用的运算符是否已重载 Visual Studio 或某些第三方工具中是否有某些功能可以自动突出显示重载运算符或对重载运
  • IQueryable 单元或集成测试

    我有一个 Web api 并且公开了一个端点 如下所示 api 假期 name name 这是 Web api 的控制器 get 方法 public IQueryable
  • 为什么这个二维指针表示法有效,而另一个则无效[重复]

    这个问题在这里已经有答案了 这里我编写了一段代码来打印 3x3 矩阵的对角线值之和 这里我必须将矩阵传递给函数 矩阵被传递给指针数组 代码可以工作 但问题是我必须编写参数的方式如下 int mat 3 以下导致程序崩溃 int mat 3
  • 如何获取分类数据的分组条形图

    I have a big dataset with information about students And I have to build a graph of dependencies between different value
  • 保护 APK 中的字符串

    我正在使用 Xamarin 的 Mono for Android 开发一个 Android 应用程序 我目前正在努力使用 Google Play API 添加应用内购买功能 为此 我需要从我的应用程序内向 Google 发送公共许可证密钥
  • C++ 中的双精度型数字

    尽管内部表示有 17 位 但 IEE754 64 位 浮点应该正确表示 15 位有效数字 有没有办法强制第 16 位和第 17 位为零 Ref http msdn microsoft com en us library system dou
  • 如何通过 Python Requests 库使用基本 HTTP 身份验证?

    我正在尝试在 Python 中使用基本的 HTTP 身份验证 我正在使用Requests https docs python requests org 图书馆 auth requests post http hostname auth HT
  • Python 2.7 缩进错误[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 这个问题是由拼写错误或无法再重现的问题引起的 虽然类似的问题可能是on topic help on topic在这里 这个问题的解决方式不
  • 如何创建用于霍夫曼编码和解码的树?

    对于我的作业 我将对霍夫曼树进行编码和解码 我在创建树时遇到问题 并且陷入困境 不要介意打印语句 它们只是让我测试并查看函数运行时的输出是什么 对于第一个 for 循环 我从主块中用于测试的文本文件中获取了所有值和索引 在第二个 for 循
  • 无需访问 Internet 即可部署 Django 的简单方法?

    我拥有的是使用 Django 开发的 Intranet 站点的开发版本以及放置在 virtualenv 中的一些外部库 它运行良好 我可以在任何具有互联网连接的计算机上使用相同的参数 使用 pip 轻松设置 virtualenv 但是 不幸
  • Python:如何在不先创建整个列表的情况下计算列表的总和?

    通常我们必须 1 声明一个列表 2 使用以下方法计算该列表的总和sum 但现在我希望指定一个以 1 开头 间隔为 4 100 个元素的列表 如下所示 1 5 9 13 17 21 25 29 33 37 我不想涉及数学公式 所以 1 如何在
  • 如何使用 enumerate 来倒数?

    letters a b c 假设这是我的清单 在哪里for i letter in enumerate letters 将会 0 a 1 b 2 c 我怎样才能让它向后枚举 如 2 a 1 b 0 c 这是一个很好的解决方案并且工作完美 i
  • 可访问性不一致:参数类型的可访问性低于方法

    我试图在两个表单之间传递一个对象 基本上是对当前登录用户的引用 目前 我在登录表单中有一些类似的内容 private ACTInterface oActInterface public void button1 Click object s
  • 没有名为“turtle”的模块

    我正在学习并尝试用Python3制作贪吃蛇游戏 我正在进口海龟 我正在使用 Linux mint 19 PyCharm python37 python3 tk Traceback most recent call last File hom
  • 堆栈是向上增长还是向下增长?

    我在 C 中有这段代码 int q 10 int s 5 int a 3 printf Address of a d n int a printf Address of a 1 d n int a 1 printf Address of a
  • GCC 的“-Wl,option”和“-Xlinker option”语法之间有区别吗?

    我一直在查看一些配置文件 并且看到它们都被使用 尽管在不同的体系结构上 如果您在 Linux 机器上使用 GCC 将选项传递给链接器的两种语法之间有区别吗 据我所知 阅读 GCC 手册时 他们的解释几乎相同 From man gcc Xli
  • 如何同时接受int和float类型的输入?

    我正在制作一个货币转换器 如何让 python 同时接受整数和浮点数 我就是这样做的 def aud brl amount From to ER 0 42108 if amount int if From strip aud and to

随机推荐

  • ASP.NET MVC3 ajax 部分视图刷新

    我在 asp net mvc3 中面临 ajax 更新 div 的问题 我有一个包含内容的视图 div Html RenderPartial RefreshComments Model div div using Ajax BeginFor
  • 如何编译将以管理员身份启动 exe 的程序[重复]

    这个问题在这里已经有答案了 可能的重复 以编程方式提升进程权限 https stackoverflow com questions 133379 elevating process privilege programatically 我想在
  • Spring 3.1 - 未找到 javascript 文件 - 404 错误

    我在文件夹 WebContent resources js test js 中有一个 js 文件 我试图在 jsp 中包含相同的文件 但是jsp文件无法找到js文件 浏览器控制台出现404错误 我已经提出了几个问题 SpringMVC 可以
  • 在哪里可以管理上传到 Gitlab.com 项目 wiki 的文件?

    在为我的私人项目创建 wiki 时 我已将一些文件上传到 gitlab com 上的 Gitlab 存储库 现在我的问题是 我可以查看已上传文件的列表吗 有什么办法可以删除其中一些吗 为什么上传文件的权限是公开的 可以改成私密吗 gitla
  • 如何从 iPhone 上的在线网址播放音频 [重复]

    这个问题在这里已经有答案了 我知道以前有很多人问过这个问题 但我只是不知道为什么这在我的 x code 和 Objective C 应用程序中不起作用 基本上 我想从 url 在应用程序中播放音频 仅使用Apple网站上的测试音频 我的代码
  • 空文件上的 AWK FNR==NR

    我正在运行以下命令 只要它们的内容在第一个文件中 该命令就可以很好地工作 awk F FNR NR a tolower 1 next a tolower 1 OutSideSyncUsers csv NewUsers csv 如果第一个文件
  • 将 ID 添加到 Google 地图标记,然后定位它[重复]

    这个问题在这里已经有答案了 我已经使用 Google Maps API v3 创建了一个 google 地图 并添加了一个自定义标记 我已经向标记构造函数添加了一个 ID 我希望使用 jQuery 以其他 JS 为目标 但目前 当我只是尝试
  • 静态链接到动态库。 glibc

    所以 我遇到一个问题 一台机器上有两个版本的 GCC 3 4 6和4 1 这是由于新软件的一些依赖性问题 需要 glibc 4 1 当我将这个新软件与 4 1 库链接时 它链接得很好 但是 当执行软件时 它找不到该库 因为它正在我的 LD
  • ExtJs 面板 - 添加动态组件

    我有一扇窗户 窗户内有面板 我动态地将组件添加到面板中 这些组件采用 hbox 布局 以便水平排列 单击按钮后 我将在 hbox 布局中向面板中添加一行类似的组件 这里的问题是我想在第一行下方添加第二行 但以下代码将组件添加到面板的顶部 p
  • Symfony2 Doctrine 查询生成器作为 FROM 子句中的子查询

    我使用查询生成器得到了一个查询 并将其分配给 qb多变的 它在 PHP 和数据库中都可以正常工作 现在 我尝试将该查询用作子查询 如下所示 subQuery qb gt getQuery gt getSql query select res
  • 如何调试 Linux 内核模块的 init_module() 调用?

    我正在迈出 Linux 内核开发的第一步 我有一些代码生成 ko我安装的内核模块insmod 我想要一种方法来调试安装模块时发生的情况 但我遇到了一些困难 我需要调试调用init module 当我运行时这个函数被调用吗insmode 我尝
  • UPI Deep Link 付款被拒绝

    我不知道在哪里问这个问题是否合适 而是我不知道在哪里问这个问题 我正在flutter中开发一个应用程序 对于应用程序内购买我正在尝试实现UPI支付 我也有一些插件可以做到这一点 但是当我测试时 我的交易被拒绝 我正在尝试通过应用程序中的 P
  • 具有多个模板参数的 C++ 概念

    Bjarne Stroustrup 最近发表了report http www stroustrup com good concepts pdf在 C 概念 中 他提到了一些让我感到惊讶的事情 该示例 第 7 1 节中 使用 速记模板表示法
  • MySQL 基于游标的多列分页

    我有一些表想要使用基于游标的分页进行查询 但它需要应用于多个列 让我们举一个使用 2 列的简化示例 我像这样获取第一页 SELECT column 1 column 2 FROM table name ORDER BY column 1 c
  • 一种唯一标识 BTLE 设备的方法

    有没有办法唯一地标识 BTLE 设备 类似于硬件 ID 我有 2 个硬件 BTLE 设备和 2 个软 BTLE 设备 使用 CBCentralManager 所有这些设备都发送相同的 UUID 当所有设备都位于我附近时 我想识别确切的 BT
  • 如何使用 jq 将当前日期和时间附加到现有 json 文件中

    我有以下格式的 json 文件 username achu password test1234 我只想将时间戳添加到上述有效负载中并将其作为某些服务的请求发送 据我所知 下面的命令将帮助我们获取 Linux 上的当前标记 date r 但不
  • 从脚本内获取 Swift 脚本的路径

    我正在用 Swift 编写一个脚本 我希望它修改一些始终与脚本本身位于同一目录中的文件 有没有办法从脚本内部获取脚本的路径 我试过 print Process arguments 但这仅输出实际提供给脚本的路径 该路径可能是完全解析的路径
  • 有没有办法使用http将打印任务发送到支持IPP的网络打印机?

    我正在开发一个 Android 打印服务应用程序 该应用程序应该允许用户执行以下操作 浏览手机的内部存储并将所选文件发送到支持 IPP 的打印机进行打印 这几天上网查了一下 只找到一个解决办法 如何在android中使用ipp 互联网打印协
  • Firefox 网络面板中的彩色条代表什么?

    在 Firefox 开发者工具中 在 Net 面板下 加载的资源的加载时间分为不同的颜色 类别 这些都是 DNS查询 连接中 Blocking Sending Waiting 接收 其中每一个代表什么 更具体地说 它们中的任何一个是否准确地
  • 通过 cython 将 python 字符串传递给 C

    我正在尝试编写一个包含一些 c 和一些 python 部分的模块 我正在使用 cython 来弥补差距 我想在 python 中存储我的 很长的 字符串常量 因为它有更好的语法 const char long string npart of