问题标签 [python-c-api]

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 投票
7 回答
10905 浏览

c++ - 是否可以在运行时修改 PYTHONPATH?

我有一个动态链接到 Python 解释器的 C++ 应用程序。我希望能够从特定目录导入 python 模块。我想为我的进程修改 PYTHONPATH,以便 sys.path 将包含我添加到 PYTHONPATH 的路径。根据本文档,这似乎是它的工作方式:

http://docs.python.org/c-api/intro.html#embedding-python

但是,当我从 Python-land 打印 sys.path 时,它具有 PYTHONPATH 的原始内容,而不是我设置的内容。这是我正在做的一个例子(使用Boost.Python):

PS - 我知道还有其他方法可以实现我的目标,但这不是我要问的。我想知道为什么 Py_Initialize() 在设置 sys.path 时不使用 PYTHONPATH 的当前值。或者也许我误解了它应该如何工作?

0 投票
2 回答
81 浏览

python - 文件形式 .py 未读入 C

假设我有来自 main 的 float x


好的问题是我的 C 程序中的 float x 从 python 接收 0 而不是数字 3

0 投票
2 回答
7165 浏览

python - 检查 PyObjects C 类型

我正在使用 Python 3.2 和 C++。

我需要提取当前存储在 PyObject 中的 C 类型。我已经检查了文档并用谷歌搜索了它,似乎没有其他人需要这样做。

所以我有一个 PyObject 并试图提取 C 值。我有需要从对象中实际提取值的函数列表,但我首先需要知道的是存储在对象本身中的内容以调用正确的函数。

以防万一这有助于理解这里是我正在尝试的一些示例代码。

希望我能有一些看起来像这样的东西

对不起,如果这个问题太长或信息太多。第一次发帖,不想留下任何可能有帮助的东西。感谢您在此问题上提供的任何帮助或见解。

0 投票
2 回答
2824 浏览

python - Limitations of PyTuple_SetItem

I have a Python extension module which creates a tuple as an attribute of another object, and sets items in the tuple. Whenever I execute this module in Python, I keep getting the error SystemError: bad argument to internal function

After reading over the docs for PyTuple, and debugging my program for a few hours, I still couldn't figure out what the hell was going on. Running my program through a debugger indicated the problem was occurring within a library call inside the Python interpreter. So, finally, I looked at the Python source code, and at long last I realized the problem. The PyTuple_SetItem function has an interesting restriction which I didn't know about, and can't find explicitly documented.

Here is the important function in the Python source (edited for clarity):

The important line here is the condition op->ob_refcnt != 1. So here's the problem: you can't even call PyTuple_SetItem unless the Tuple has a ref-count of 1. It looks like the idea here is that you're never supposed to use PyTuple_SetItem except right after you create a tuple using PyTuple_New(). I guess this makes sense, since Tuples are supposed to be immutable, after all, so this restriction helps keep your C code more in line with the abstractions of the Python type system.

However, I can't find this restriction documented anywhere. Relevant docs seem to be here and here, neither of which specify this restriction. The docs basically say that when you call PyTuple_New(X), all items in the tuple are initialized to NULL. Since NULL is not a valid Python value, it's up to the extension-module programmer to make sure that all slots in the Tuple are filled in with proper Python values before returning the Tuple to the interpreter. But it doesn't say anywhere that this must be done while the Tuple object has a ref count of 1.

So now, the problem is that I've basically coded myself into a corner because I wasn't aware of this (undocumented?) restriction on PyTuple_SetItem. My code is structured in such a way that it's very inconvenient to insert items into the tuple until after the tuple itself has become an attribute of another object. So, when it comes time to fill in the items in the tuple, the tuple already has a higher ref count.

I'll probably have to restructure my code, but I was seriously considering just temporarily setting the ref count on the Tuple to 1, inserting the items, and then restoring the original ref count. Of course, that's a horrible hack, I know, and not any kind of permanent solution. Regardless, I'd like to know if the requirement regarding the ref count on the Tuple is documented anywhere. Is it just an implementation detail of CPython, or is it something that API users can rely on as expected behavior?

0 投票
2 回答
1221 浏览

python - Python C API:为什么 PyRun_String 不评估简单的条件表达式?

PyErr_Print() 打印返回错误:

我究竟做错了什么?谢谢你。

0 投票
1 回答
1606 浏览

python - Python C API:如何使用 Py_eval_input 获取 PyRun_String 以使用导入的模块?

返回错误:

在代码的前面,我做了:

我想这不是让它工作的方法。正确的方法是什么?谢谢!

0 投票
1 回答
2135 浏览

python - 从 C 将对象返回给 Python

我已经阅读了 Python C-API 的文档,甚至还编写了一些扩展模块。但是,当涉及从 C 函数返回 Python 对象时,我仍然不清楚确切的语义。

Python 文档中的有限示例通常显示一个 C 函数,该函数返回Py_BuildValue. 现在,Py_BuildValue返回一个New Reference, 并将这个引用的所有权转移给解释器。那么,我可以由此推断,返回给 Python 的任何对象都必须是一个新的引用,并且从 C 函数返回一个对象与将对象的所有权转移给解释器是一样的,这是一个通用规则吗?

如果是这样,那么返回一个已经被某物拥有的对象的情况呢?例如,假设您编写了一个接受 a PyObject*which is a的 C 函数tuple,然后调用PyTuple_GetItem它并返回结果。 PyTuple_GetItem返回一个借用的引用- 意味着该项目仍然由元组“拥有”。那么,在将结果返回给解释器之前,返回类似结果的 C 函数PyTuple_GetItem是否必须得到结果?INCREF

例如:

0 投票
1 回答
3250 浏览

python - 如何找出 PyImportModule 导入失败的原因?

我在嵌入 Python (2.7.1) 的 C 应用程序中有此代码:

PyImport_ImportModule失败时,它返回 NULL。如何找出无法导入的原因?(例如,当导入模块工作时,在嵌入之外找到)。

(代码是py-exim-localscan 的一部分,我想添加更多关于在极少数情况下发生故障的信息)。

0 投票
2 回答
3108 浏览

python - 如何在 C 扩展中创建自定义 Python 异常类型?

我正在用 C 编写一个 Python 模块。我需要报告内置 Python 异常无法描述的错误。因此,我希望抛出我自己类型的异常。问题是,Python 策略是从 BaseException 类派生所有异常。我知道如何创建派生类型对象(分配给 tp_base memeber),但我不知道如何获取对 BaseException 类型对象的引用。PyExc_BaseException 是对 PyObject 的引用,表示一个类,而不是类型对象。

如何从 C 代码中抛出自定义 Python 异常?

0 投票
1 回答
213 浏览

c++ - 如何让 python 识别读取预编译的共享文件?

我有一个用 C++ 创建的包,并且已经将它编译到一个共享库中。

当我用自己的 main 函数链接它时,我可以通过直接调用初始化函数 initfoo 来初始化包,一切正常。

如何让 python 将我的共享库识别为一个包,所以我可以输入:

从常规 python 解释器运行?

我对使用 distutils 编译文件不感兴趣,因为编译必须是常规 cmake 构建系统的一部分。我只需要创建加载我的共享库所需的任何包文件。

更新:我现在可以正常工作了。问题在于 cmake 默认为共享库名称的 lib 前缀。要解决这个问题需要

对于 Mac OS X