问题标签 [python-extensions]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - Cython 构建的扩展无法导出数据类型和函数
我刚刚设法为 Python 构建了我的第一个 C 扩展,使用 Cython 调用现有的 C 库。
我将我的数据类型和函数声明并定义为逻辑组件(遵循 C 库的逻辑结构),并将它们组合到一个 pyx 文件中 - 在我尝试单独添加文件时发生错误之后(IIRC 我得到了一个错误按照已经定义的 init 行——在谷歌上研究了这个问题之后,我发现我必须将所有 pyx 文件信息合并到一个 pyx 文件中)——参见这个链接。
这是我的 foo.pyx 文件内容的副本:
这是我的设置文件的副本:
扩展成功构建到 foo.so 中,然后我可以在 Python CLI 中键入“import foo”。这也有效。但是,当我尝试访问我在 myarray.pxd、myarray.pyx 等中声明/定义的任何类时,我收到错误消息:
然后我尝试了 dir(),看看 foo 模块正在导出什么。令我惊讶的是,这就是它列出的内容:
为什么 Cython 无法导出我声明和定义的结构、类和函数?我认为我的 pxd 和 pyx 文件没有任何问题,因为就像我说的,它编译成功并且生成了共享库(python 扩展)。
我在 Ubuntu 上使用 Cython 0.15.1 和 Python 2.6.5
python - 自由函数的 Cython 编译错误(无法将 Python 对象参数转换为类型 'FooBar *')
我正在使用 Cython (0.15.2) 为 Python (2.6.5) 创建扩展。我创建了一个 pxd 文件和一个 pyx 文件。这是我的 pyx 文件的内容:
如果我注释掉自由(即非成员)函数定义语句,代码会正确编译并生成扩展。但是,如果我取消注释并尝试编译该文件,我会收到以下错误消息:
cafuncs.pyx:64:23:无法将 Python 对象参数转换为类型 'FooBar *'
这是什么原因,我该如何解决?
python - SWIG 将 C 库连接到 Python(SWIG 生成的类使用起来很麻烦)
我正在使用 SWIG 为我的 C 库生成 Python 语言绑定。我已经设法构建绑定和导出的数据结构,但是在使用该库时我不得不跳过一些障碍。
例如,C 标头具有如下数据类型和函数原型:
在我的 SWIG 接口文件中,我正在导出函数和 MyStruct 数据类型。假设我的 python 扩展模块被称为 foobar,那么我可以像这样编写 Python 脚本:
声明一个对象然后在使用它之前为其分配一个指针非常麻烦(并且容易出错)。有没有更好的方法来使用 SWIG 生成的类?我正在考虑包装更高级别的类(或子类化 SWIG 生成的类)以自动处理对象的创建和销毁(以及提供一些 OBVIOUS 成员函数,如 MYSTRUCT_Func1()。
但是,如果我对 SWIG 生成的类进行包装/子类化,那么我不确定是否可以将新类传递给期望指向 C 结构的指针的 C API 函数。我不能直接修改 SWIG 生成的类(或者至少我不应该)——出于显而易见的原因。
解决此问题的最佳方法是什么?创建/销毁对象的更 Pythonic 方式,同时能够将指针直接传递给暴露的 C 函数?
c++ - SWIG C++ 到 Python:接受指向原始类型的指针的类型映射和方法
我正在为现有库编写 Python 扩展。一些函数接受指向原语的指针,因此 arg 可以作为输出。
这不是很 Pythonic,所以我想使用 SWIG 文档中解释的类型映射,以便函数返回元组。
这是我的 SWIG 接口文件的片段(仅显示与此问题相关的部分)
SWIG 文档似乎没有说明我是否可以按照我上面所做的方式使用多个 OUTPUT(宏?) - 这安全吗?
c++ - 如何在 C++ 中高效地构建 Python 字典
出于性能原因,我想将我的 python 程序的一部分移植到 C++,因此我尝试为我的程序编写一个简单的扩展。C++ 部分将构建一个字典,然后需要将其传递给 Python 程序。
我发现的一种方法似乎是在 C++ 中构建类似 dict 的对象,例如 a boost::unordered_map
,然后使用能够生成 Python dicts的Py_BuildValue
[1]方法将其转换为 Python。但是这种包括将容器转换为字符串表示并返回的方法似乎有点“迫在眉睫”,无法成为最高效的解决方案!?
所以我的问题是:在 C++ 中构建 Python 字典的最高效方法是什么?我看到 boost 有一个 Python 库,它支持 C++ 和 Python 之间的映射容器,但到目前为止我还没有在文档中找到我需要的确切内容。如果有这种方式,我宁愿直接在 C++ 中构建 Python dict,这样就不需要复制等。但是,如果最有效的方法是另一种方法,我也很擅长。
这是我编译成 .dll/.pyd 的(简化的)C++ 代码:
我想在 Python 中使用,例如:
字典会将字符串映射到整数。谢谢你的帮助!
python - python c扩展模块中没有返回值的方法
我正在尝试在 python 中创建一个通过并行端口发送数据的脚本。我正在用 C 语言创建自己的模块。
问题是:当我尝试执行我的模块时,python 崩溃了。没有错误,没有数据,什么都没有。它只是关闭。
这是我的模块:
(它可以在没有所有 python 混乱的情况下工作)我通过 distutils 编译它,然后在终端(使用 xubuntu)中,我输入:
在这里,它脱离了python,它输入了“markmb@...”
提前致谢!
python - Python 扩展未安装到子包中
我正在尝试构建一个 Python 扩展并使用 distutils 将其打包,但无论我如何命名,该扩展都会安装在根包中。我的目录布局如下所示:
我的setup.py
样子是这样的:
我设置了一个virtualenv
并运行
然后在我的 Python shell 中:
我可以更改什么以使第一个导入语句起作用而第二个导入语句失败?
python-3.x - ESX 4.0 中的 SFCB、python 绑定层和 python 提供程序存在问题
我们正在用 python 编写 SFCB 提供程序,由于 SFCB 只与 C++ 提供程序对话,我们需要一个中间层(cmpi-bindings,一个 python 扩展模块),它可以与 SFCB 对话并在需要时启动提供程序。
相同的 cmpi 层在 ESX 4.1 上运行时完全正常(即读取 SFCB 调用然后运行 python 提供程序),但在 ESX 4.0 上它无法导入 python 模块。
经过一些调试,我发现导入 datetime 模块失败,出现未解析的符号 (PyExc_IOError) 错误。我尝试使用 -XLinker --exportdynamic 构建这些模块,以便它们按照嵌入在应用程序中的 Python 解释器中的建议查找那些未解析的符号,无法加载本机模块,但徒劳无功。
接下来我可以尝试哪些选项。(因为相同的代码库适用于 4.1 但不适用于 4.0)。任何指示都会有所帮助
c++ - c ++ python扩展中的零星段错误
我有一个 python 对象,它通过 HTTP 访问和下载一些文本。我正在运行这个 python 对象,并使用 c++ 代码处理该文本。IE
大多数 URL 都可以正常工作——c++ 代码得到了正确的字符串,我可以处理它,一切都很好。一些在浏览器上看起来(基本上)与其他 URL 相同的特定 URL,会导致 PyString_AsString() 方法中的段错误:
如果我打印出应该由python方法返回的字符串(上面伪代码中的'dataStr'),它看起来很好!我不知道是什么导致了这个问题——任何关于如何进行的提示都将不胜感激!谢谢
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
解决方案:
我使用的模板代码调用了
在我打电话之前
为什么要为某些特定的函数调用释放它,我不知道。正如“Gecco”在下面的评论中所说,
'PyString_AsString 文档说:“指针指的是字符串的内部缓冲区,而不是副本。不得以任何方式修改数据,除非字符串刚刚使用 PyString_FromStringAndSize(NULL, size) 创建。不得释放。 " '
python - 从 Python C 扩展中导入和使用标准 Python 模块
我有用 C 编写的 Python 扩展模块。我想在这个 C 代码中使用标准 Python 模块之一,例如os
或shutil
. 如何最好地做到这一点?