通过 cython 从 c 调用 python 代码

2024-01-30

所以我想通过 cython 从 c 调用一些 python 代码。我已经设法从 c 调用 cython 代码。我还可以从 cython 调用 python 代码。但当我把它们加在一起时,有些东西就不见了。

这是我的Python代码(quacker.pyx):

def quack():
    print "Quack!"

这是我的 cython“桥”(caller.pyx):

from quacker import quack

cdef public void call_quack():
    quack()

这是c代码(main.c):

#include <Python.h>
#include "caller.h"

int main() {
  Py_Initialize();
  initcaller();
  call_quack();
  Py_Finalize();
  return 0;
}

当我运行这个时,我得到这个异常:

Exception NameError: "name 'quack' is not defined" in 'caller.call_quack' ignored

我怀疑缺失的部分:

  • 我还没打电话initquacker()
  • 我没有包括在内quacker.h
  • Cython 没有产生任何quacker.h - only quacker.c
  • caller.c不导入quacker.h或致电initquacker()

我不太确定是否有可能做我想做的事情,但在我看来应该是这样。我很想听听您的任何意见。

Edit:

这就是我 cythonize / 编译 / 链接 / 运行的方式:

$ cython *.pyx
$ cc -c *.c -I/System/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7
$ cc -L/System/Library/Frameworks/Python.framework/Versions/2.7/lib -L/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/config -lpython2.7 -ldl *.o -o main
$ ./main

如果您重命名quacker.pyx to quacker.py,实际上一切都是正确的。唯一的问题是你的程序不会在当前目录中搜索 python 模块,从而导致输出:

Exception NameError: "name 'quack' is not defined" in 'caller.call_quack' ignored

但是,如果将当前目录添加到 PYTHONPATH 环境变量中,输出将成为您期望的输出:

$ PYTHONPATH=".:$PYTHONPATH" ./main 
Quack!

运行python shell时,根据文档 http://docs.python.org/2/tutorial/modules.html#the-module-search-path当前目录(或包含脚本的目录)被添加到sys.path自动变量,但是当使用创建一个简单的程序时Py_Initialize and Py_Finalize这似乎不会发生。由于 PYTHONPATH 变量也用于填充sys.pathpython 变量,上面的解决方法会产生正确的结果。

或者,在下面Py_Intialize行,您可以添加一个空字符串到sys.path如下所示,只需执行一些指定为字符串的 python 代码:

PyRun_SimpleString("import sys\nsys.path.insert(0,'')");

重新编译后,运行即可./main然后应该可以工作。

Edit

如果您按照问题中指定的方式运行代码,那么看看会发生什么实际上很有趣,因此无需重命名quacker.pyx文件。在这种情况下,initcaller()函数尝试导入quacker模块,但由于没有quacker.py or quacker.pyc存在,找不到该模块,并且initcaller()函数产生错误。

现在,通过引发异常,以 python 方式报告此错误。但代码中的main.c文件不检查这一点。我不是这方面的专家,但在我的测试中添加了以下代码initcaller()似乎有效:

if (PyErr_Occurred())
{
    PyErr_Print();
    return -1;
}

程序的输出结果如下:

Traceback (most recent call last):
  File "caller.pyx", line 1, in init caller (caller.c:836)
    from quacker import quack
ImportError: No module named quacker

通过致电initquacker()功能before initcaller(), 模块名称quacker已经注册了,所以导入调用是在里面完成的initcaller()将检测到它已经加载并且调用将成功。

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

通过 cython 从 c 调用 python 代码 的相关文章

随机推荐

  • 在 Eclipse 中配置 Logback

    我正在从 Log4j 切换到 Logback 但我还没有成功地使 Logback 工作 我已经放置了logback xml在我的 Eclipse Java 项目的根目录中 下面是其内容
  • 样式选择下拉框

    我有一个 HTML 选择下拉框 我已经对其进行了样式设置 我遇到的问题是我似乎无法设置选项的背景颜色样式 下面是演示的链接 您可以看到下拉选项有白色背景 我正在尝试更改它 http cssdeck com labs lnroxrua htt
  • 如何从 xml 获取垂直按钮视图

    我想在垂直方向创建一个按钮 也许我们可以通过扩展一个按钮并将画布重新渲染 旋转 到垂直方向 我们可以获得自定义按钮 但我需要从 xml 检查图形表示 我需要一个像这样的按钮 请参阅下面的链接 应该可以解决您的问题 http blog sty
  • 如何在ionic 3中使用jquery

    我正在尝试使用 ionic 3 中的 jquery 在 div 中加载外部网站 TS export class HomePage constructor public navCtrl NavController loadExternalUR
  • 将字符串扫描为十六进制字符数组

    这是我的示例代码 char a char str 20 unsigned char b 8 unsigned char c 8 int argsread int i init 8051 while 1 printf n enter a 64
  • Google 机器人使用 HTML5 模式路由在 AngularJS 网站上爬行

    我们有一个使用 HTML5 路由的 AngularJS 网站 我刚刚做了一些测试 Fetch as Google 运行 结果有点令人困惑 在获取选项卡上 我看到我们的网站在查看源代码中的样子 其中包含所有前端绑定 但并非所有呈现的 HTML
  • Eclipse - 轻松访问常用文件夹?

    有谁知道 Eclipse 在项目中使用 最喜欢的文件夹 的插件吗 我的项目 共有 1000 多个文件夹 中可能有 2 或 3 个文件夹 我经常在它们之间切换 每次使用 Project Explorer 中的滚动条来到达正确的文件夹确实很麻烦
  • 我可以使用什么工具来分析内存使用情况? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有一个使用 Visual Studio 2008 使用 C 编写的 Windows 应用程序 我想获取内存使用情况的统计信息 以查找内存
  • 重命名(别名)数组元素 C

    不确定什么是 良好实践 或被认为更 正确 我有一个数组 我想通过 arrayname 以外的名称访问各个元素 我可以使用 defines 或指针 也可能使用其他方式 Example define value1 myarray 1 int m
  • 在 html 电子邮件中发送个性化图像的推荐方式是什么?

    我知道已经有人问过类似的问题 但答案几乎总是相同的 您需要在服务器上共享图像并从电子邮件中链接到它 为了我的目的 我不能那样做 图像需要针对我发送电子邮件的每个用户进行个性化 因此将为每个用户动态生成电子邮件 并且不会始终相同 我无法共享图
  • LINQ to SQL 通配符

    如何在 LINQ To SQL lambda 表达式中构建通配符 这就是我目前所拥有的 var query from log in context Logs select log foreach string filter in Custo
  • 将列表项转换为元组

    我有一个这样的清单 February 01 2011 February 28 2011 March 01 2011 March 31 2011 我想将其转换为 February 01 2011 February 28 2011 March
  • 如何从数组中获取唯一值

    请注意这是针对 OSX 的 不适用于 iOS 我在其他问题中查看并尝试了一些解决方案 但似乎没有一个对我有用 因此 我想从数组中获取一组独特的年份 我的代码是这样的 NSMutableArray unique NSMutableArray
  • 使用 PEAR/Mail_Queue 发送 10,000 多封电子邮件的最佳方式

    我有一个 cron 它生成整个邮件信息并使用以下命令放入数据库表中 mail queue gt put 可以选择在发送电子邮件后将其删除 这是我需要一点帮助的地方 在获得上述信息后 发送电子邮件的最佳方式是什么 运行 mail queue
  • 自动布局:layoutMarginsGuide

    如何重写视觉格式 addConstraints NSLayoutConstraint constraintsWithVisualFormat label options AlignAllBaseline metrics nil views
  • 为什么我的列表项项目符号与浮动元素重叠

    我有一个 XHTML Strict 页面 其中我将图像与常规文本段落一起浮动 一切都很顺利 除非使用列表而不是段落 列表的项目符号与浮动图像重叠 更改列表或列表项的边距没有帮助 边距是从页面左侧开始计算的 但浮动会将列表项推到右侧insid
  • 无法使用 Apache PDFBOX 验证数字签名

    我是使用数字签名的新手 在其中一个项目中 我们使用 Apache PdfBox 来处理数字签名的 pdf 文件 虽然我们可以测试所有功能 但签名 pdf 文件的验证是我们无法破解的 我们使用 BouncyCastle 作为提供者 下面是代码
  • Tomcat连接器connectionTimeout和keepAliveTimeout之间的关系

    我想知道tomcat连接器的connectionTimeout和keepAliveTimeout属性之间的关系是什么 它们是否应该设置为相同的值 因为它是默认值 keepAliveTimeout 小于 connectionTimeout 有
  • 我的 PHP 会话不会保存在 hostgator 上

    意料之外 如何解决这个问题 我的会话无法在 Hostgator 服务器上运行 但在其他服务器上它工作正常 这是代码示例
  • 通过 cython 从 c 调用 python 代码

    所以我想通过 cython 从 c 调用一些 python 代码 我已经设法从 c 调用 cython 代码 我还可以从 cython 调用 python 代码 但当我把它们加在一起时 有些东西就不见了 这是我的Python代码 quack