问题标签 [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-2.7 - Python 2.x C 扩展模块中 PyMODINIT_FUNC 的对立面是什么?
我需要datetime
在我的 C 扩展模块中导入一个核心模块 (),因为我想datetime.date
从我的模块的某些函数中返回 a。
似乎 Python C 扩展模块PyMODINIT_FUNC
对销毁时没有补充。
问题:除了在我的 C 扩展模块内的每次调用中一次又一次地导入所需的模块,然后在调用结束时再次取消引用它,我还能做什么?
理由:基本上我担心这(一遍又一遍地导入)会产生不必要的开销,因为根据我对文档取消引用的理解,这意味着垃圾收集器可以过来收集它,所以下次PyImport_ImportModule
必须再次调用.
一些相关的问题:
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?
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
这是我尝试过的:
- 选择 Fortran 编译器。由于我使用的是 64 位 Python,因此需要 64 位 Fortran 编译器。从MinGW-w64,我尝试了一些个人构建。
- 打开一个新的
cmd.exe
shell,并编辑我提取 GCC 编译器的路径,即:set PATH=%PATH%;c:\gnu\mingw64\bin
set C_INCLUDE_PATH=C:\gnu\mingw64\include
使用以下命令尝试
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 构建扩展?
c - 如何从 C 扩展访问 python 类?
我有我用 C 编写的 Python 扩展。目前,我需要在某个外部纯 Python 模块中声明的类型的扩展对象的函数中进行处理(比如说,它的名称是ext_module
)。首先,我需要确保输入对象类型对应于ext_module
. 我该如何实施?一些额外的代码:
实际上我可以尝试调用预期的方法并得到一个异常NotImplementedError
,但我不确定这是否是正确的方法。
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”会触发错误参数错误.
有谁知道如何解决这一问题?
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
内部的实际工作方式使我无法理解。
也可能是我的问题是由完全不同的东西引起的。
谢谢你。
python - 使用 pyqt 将输入输入到 .c 文件
我创建了需要输入(通过 scanf)的 ac 程序。然后我创建了 .so 文件并在 python 脚本中调用它,这样当我运行脚本时,将在终端中询问输入。但是当我运行 python 程序时,终端挂起。
请注意:
1.我的c代码
2.我用于编译代码的命令
3.创建.so文件
4.python程序相关部分
加载.so文件
调用c程序中定义的函数
谢谢收听 :)
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
再次调用。这将防止任何未来的查询失败,但它仍然会产生当前查询中止的效果。
谢谢克里斯
python - PyArg_ParseTupleAndKeywords() 中的 None 值 PyObject 为 NULL
我将扩展类型对象传递给 Python 函数,该函数需要将这种类型的变量传递给 C 函数。我的扩展类型如下所示:
rec_rset_t 是指向结构的指针,如下所示:
其中 rec_rset_s 是这样定义的:
所以我有一个 Python 扩展函数,它接收一个 RSet 对象作为参数。
问题是我希望能够传递对象,并将其转换None
为RSet
C 中的 NULL 以及变量rst
为 NULL。如果我通过None
,我会遇到分段错误,因为"O"
选项 PyArg_ParseTupleAndKeywords
不处理 None 值PyObject
(这与选项不同,如果我们传递字符串"s"
,我们可以使用该选项)。我尝试手动检查对象,但没有奏效。所以目前我正在做一些不太优雅的事情,就像这样:"z"
NULL
Py_None
因为那是rset->rst
我传递时的值None
,然后将其传递rset->rst
给cquery
函数。接收扩展类型对象时如何传递None
值?PyArg_ParseTuple
有没有一种通用的方法可以做到这一点?
编辑:
我错误地检查了 Py_None 的 rset->rst 的值。检查
评估为真,所以是的,没有处理。但是值 rset->rst(我传递给 cquery)不是 NULL,这正是我想要的。手动设置 rset->rst = NULL 是唯一的方法吗?
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
无论实例的类风格如何,如何执行相同的行为?