问题标签 [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.

0 投票
0 回答
251 浏览

python-2.7 - Python 2.x C 扩展模块中 PyMODINIT_FUNC 的对立面是什么?

我需要datetime在我的 C 扩展模块中导入一个核心模块 (),因为我想datetime.date从我的模块的某些函数中返回 a。

似乎 Python C 扩展模块PyMODINIT_FUNC对销毁时没有补充。

问题:除了在我的 C 扩展模块内的每次调用中一次又一次地导入所需的模块,然后在调用结束时再次取消引用它,我还能做什么?

理由:基本上我担心这(一遍又一遍地导入)会产生不必要的开销,因为根据我对文档取消引用的理解,这意味着垃圾收集器可以过来收集它,所以下次PyImport_ImportModule必须再次调用.

一些相关的问题:

0 投票
1 回答
283 浏览

memory-management - Python/Numpy C++ extension: memory issue

I wrote a python extension in C++ to work with numpy arrays. I have a memory issue.

I have a 3D numpy array with values > 0 before I call the extension. Once I am in the extension I get the numpy array using this function:

Using " !O " should borrow the reference to python so that I have directly access to my numpy array.

Then I access the data:

Later I check that values present in myArray are still positive:

And every time I run into the case where the value is < 0. And it is not just "-0.0000", it is rather "-19.73".

So does anyone already encountered this kind of problem or does anyone know where it comes from and how to solve it?

0 投票
3 回答
8632 浏览

numpy - 在 Windows 上使用 f2py 构建 64 位 Python 扩展

我正在尝试使用 Numpy 的f2py.py脚本从 Fortran 源代码构建 Python 扩展。我正在按照http://www.scipy.org/F2PY_Windows网络存档)中的步骤进行操作。我的系统是 Windows 7 64 位,我主要使用 Python 2.7.3 [MSC v.1500 64 位 (AMD64)]。我有 Numpy-MKL 1.7.1,来自http://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy

这是我尝试过的:

  1. 选择 Fortran 编译器。由于我使用的是 64 位 Python,因此需要 64 位 Fortran 编译器。从MinGW-w64,我尝试了一些个人构建。
  2. 打开一个新的cmd.exeshell,并编辑我提取 GCC 编译器的路径,即:
    • set PATH=%PATH%;c:\gnu\mingw64\bin
    • set C_INCLUDE_PATH=C:\gnu\mingw64\include
  3. 使用以下命令尝试f2py.py构建:

    C:\Python27\python.exe C:\Python27\Scripts\f2py.py -c --fcompiler=gnu95 --compiler=mingw32 -lmsvcr90 -m foo foo.f90

输出为(去除 处的噪声线<--snip-->):

请注意,第一次运行时,会生成三个新文件C:\Python27\libs

  • libmsvcr90.a
  • libpython27.a
  • python27.def

我需要安装其他东西吗?我需要提供其他选项f2py吗?更一般地说,是否可以从 GNU 编译器为 MSVC 构建 Python 构建扩展?

0 投票
0 回答
1715 浏览

c - 如何从 C 扩展访问 python 类?

我有我用 C 编写的 Python 扩展。目前,我需要在某个外部纯 Python 模块中声明的类型的扩展对象的函数中进行处理(比如说,它的名称是ext_module)。首先,我需要确保输入对象类型对应于ext_module. 我该如何实施?一些额外的代码:

实际上我可以尝试调用预期的方法并得到一个异常NotImplementedError,但我不确定这是否是正确的方法。

0 投票
2 回答
6106 浏览

python - 使用 distutilscross 交叉编译 python 本机 C 扩展,setup.py 将不接受“-x”参数

我有一个 Python 的工作交叉编译,但是我尝试使用 distutilscross 从 i2c-tools 交叉编译 py-smbus 扩展,但无法通过命令行。

文档(https://pypi.python.org/pypi/distutilscross)建议它应该像python setup.py build -x(在设置适当的环境变量之后)一样简单,但是当我运行该命令时,“-x”会触发错误参数错误.

有谁知道如何解决这一问题?

0 投票
1 回答
928 浏览

linux - 定义相同函数名的两个 linux 共享对象之间的冲突

我的问题涉及 Python、Qt、PyQt 和其他东西,但问题实际上是关于 Linux 的ld.so实际工作方式。

问题

如果一个程序加载了两个不同的共享库,它们都具有相同的入口点名称(即它们都定义了具有相同名称和签名的函数),它如何知道它正在调用哪个版本?

我的问题

我有一个用 C++ 编写的第三方专有 Linux 应用程序(尽管与原始语言无关),它与 Qt3.3 动态链接。该应用程序嵌入了一个 Python 解释器,可用于为其编写脚本。

您甚至可以使用应用程序的嵌入式 python 而不是原来的使用以下命令:

它显示以下内容:

使用 gcc 4.1.2 我已经从源代码构建并安装了 PyQt4,与系统也拥有的 Qt4 库相对。我相信构建是成功的,因为我可以使用以下命令运行一个小型 PyQt4 应用程序:

但是,如果我使用其 GUI 加载程序并加载相同的脚本,它会在第一次PyQt4调用时崩溃,这是QApplication类的实例化。

由于python环境相同,我怀疑可能是Qt3和Qt4之间的某种共享库冲突。但是,该命令strace -e trace=file显示 python 在这两种情况下都在定位和加载正确的 Qt4 库。

所以,我的问题是,如果一个程序加载了两个定义相同函数的共享不同库,它怎么知道它调用了正确的库?linux 加载程序是否ld.so以某种方式使用文件名或其他内容限定入口点?我怀疑我的问题可能出在那儿,该应用程序最终加载了两个不同的实例,QApplication并且调用了错误的实例,但是ld.so内部的实际工作方式使我无法理解。

也可能是我的问题是由完全不同的东西引起的。

谢谢你。

0 投票
1 回答
303 浏览

python - 使用 pyqt 将输入输入到 .c 文件

我创建了需要输入(通过 scanf)的 ac 程序。然后我创建了 .so 文件并在 python 脚本中调用它,这样当我运行脚本时,将在终端中询问输入。但是当我运行 python 程序时,终端挂起。

请注意
1.我的c代码

2.我用于编译代码的命令

3.创建.so文件

4.python程序相关部分
加载.so文件


调用c程序中定义的函数

谢谢收听 :)

0 投票
0 回答
670 浏览

python-2.7 - 为什么发送到 Python 脚本的 SIGINT 会终止 MySQL 连接?

我在将 SIGINT 发送到使用 MySQLdb(mysql-python)连接到 MySQL 数据库的 python 脚本时遇到问题。python 脚本在无限循环中运行,我想在完成脚本的当前循环后捕获 SIGINT 并优雅地退出。但是,SIGINT 会中断正在运行的任何 mysql 查询,并与服务器断开连接。这会导致错误,因为 python 脚本试图完成它的当前循环。

我已将行为范围缩小到以下脚本:

无穷大.py

如果我从命令行运行此脚本,然后从另一个 shell(使用sudo kill -INT $PID)向它发送一个 SIGINT,我会得到以下输出:

handling SIGINT发送信号后立即输出,紧随其后Finished very long query。所以很明显,execute通话被打断了。我还用 gdb 调试了上面的脚本,当我发送 SIGINT 时,gdb 停止并给出以下输出:

有趣的是,当我通过 gdb 运行 python 信号处理程序的打印行时,它不会执行,但它确实会中断 libpthread.so.0 中的执行。

MySqldb 包底层的 C 代码是否注册了它自己的信号处理程序?查询是否在单独的线程中运行,如果是,它是否接收信号以及 python 脚本?

有什么办法可以防止这种行为?我发现我可以修改信号处理程序以重新连接到 MySQL(通过MySQLdb.connect再次调用。这将防止任何未来的查询失败,但它仍然会产生当前查询中止的效果。

谢谢克里斯

0 投票
1 回答
3370 浏览

python - PyArg_ParseTupleAndKeywords() 中的 None 值 PyObject 为 NULL

我将扩展类型对象传递给 Python 函数,该函数需要将这种类型的变量传递给 C 函数。我的扩展类型如下所示:

rec_rset_t 是指向结构的指针,如下所示:

其中 rec_rset_s 是这样定义的:

所以我有一个 Python 扩展函数,它接收一个 RSet 对象作为参数。

问题是我希望能够传递对象,并将其转换NoneRSetC 中的 NULL 以及变量rst为 NULL。如果我通过None,我会遇到分段错误,因为"O"选项 PyArg_ParseTupleAndKeywords不处理 None 值PyObject(这与选项不同,如果我们传递字符串"s",我们可以使用该选项)。我尝试手动检查对象,但没有奏效。所以目前我正在做一些不太优雅的事情,就像这样:"z"NULLPy_None

因为那是rset->rst我传递时的值None,然后将其传递rset->rstcquery函数。接收扩展类型对象时如何传递None值?PyArg_ParseTuple有没有一种通用的方法可以做到这一点?

编辑:

我错误地检查了 Py_None 的 rset->rst 的值。检查

评估为真,所以是的,没有处理。但是值 rset->rst(我传递给 cquery)不是 NULL,这正是我想要的。手动设置 rset->rst = NULL 是唯一的方法吗?

0 投票
1 回答
640 浏览

python - PyInstance_NewRaw() 具有新旧样式类

最近,我在尝试实例化对象而不调用其构造函数时在基于 C 的 python 扩展中遇到了一个问题——这是扩展的要求

用于创建实例的类是动态获取的:在某些时候,我有一个实例x,我希望使用它的类来创建其他实例,所以我存储x.__class__以供以后使用——让这个值成为klass.

稍后,我调用PyInstance_NewRaw(klass, PyDict_New()),然后问题出现了。似乎 ifklass是一个旧式类,该调用的结果是所需的新实例。但是,如果是新式类,则结果为 NULL,引发的异常为:

SystemError:../Objects/classobject.c:521:内部函数的参数错误

作为记录,我使用的是 Python 版本2.7.5。谷歌搜索,我发现只有一个人在寻找解决方案(在我看来,他正在做一个解决方法,但没有详细说明)。

对于记录#2:扩展正在创建的实例是这些相同x实例的代理 -x.__class__x.__dict__是已知的,因此扩展基于__class__(使用上述 C 函数)生成新实例并将各自设置为__dict__新实例实例(那些__dict__具有进程间共享内存数据)。第二次调用实例不仅在概念上存在问题__init__(首先:它的状态已经知道,其次:ctor 的预期行为是它们应该为每个实例只调用一次),这也是不切实际的,因为扩展不能找出__init__()系统中每个实例的参数及其调用顺序。此外,改变__init__系统中每个类的实例可能是代理,并让他们知道他们将受到代理机制的影响在概念上是有问题的(他们不应该知道它)并且不切实际。

所以,我的问题是:PyInstance_NewRaw无论实例的类风格如何,如何执行相同的行为?