问题标签 [python-embedding]

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

python - 在 Qt 5 中嵌入 Python

我想将 Python 解释器嵌入到 Qt 5 应用程序中。

我在 Qt 5 中有一个工作应用程序,但是当我把

在顶部(Qt 标头下方)编译中断为

当我将 Python 标头放在 Qt 标头上方时,它会中断

请问,有谁知道为什么会这样?我可能是因为 Qt 和 Python 定义了一些常用词?我能做些什么呢?

0 投票
1 回答
1908 浏览

python - 将 C 对象添加到 Python 列表并将 C 对象列表返回给 python

我正在为 python 编写 C 扩展。

我想知道如何使用PyList_SetItem. 例如,

我有一个 C 对象。

我列了一个清单:

我不确定以下语句中的第三个参数必须是什么。

另外,我如何将这个 C 对象列表返回给 python。

0 投票
1 回答
877 浏览

python - 第二次python执行失败

我在为需要在 python 中运行自定义脚本的应用程序嵌入 python 3 引擎时遇到问题。由于脚本可能完全不同,有时是用户提供的,我试图使每个执行隔离,并且不需要在不同脚本的执行之间保留任何数据。

所以,我的解决方案是将每次执行包装在Py_Initialize和之间Py_Finalize。它看起来像这样:

但是,对于特定的 python 脚本,这在第二次执行脚本时会失败:

python 脚本如下所示:

如您所见,脚本第一次执行时“完成!” 被打印出来了。但是第二次它在复制函数内部引发了一个异常。

看起来 python 引擎在第一次初始化完成后处于某种奇怪的状态。注意,这是python 3。

另外,值得注意的是 Python 2.7 没有这个问题。

我想可能还有其他例子可以更好地揭示正在发生的事情,但我还没有时间找到。

测试项目的完整来源可以在这里找到: https ://docs.google.com/file/d/0B86-G0mwwxZvNGpoM1Jia3E2Wmc/edit?usp=sharing

请注意,该文件为 8MB,因为它包含 python 发行版。

任何关于如何解决这个问题的想法都值得赞赏。

编辑:我还放了一个包含标志的项目副本以在 Python 3 和 Python 2.7 之间切换(文件为 31 MB):https ://docs.google.com/file/d/0B86-G0mwwxZvbWRldTd5b2NNMWM/edit?usp=分享

编辑:嗯,我用 Python3.2 测试过,效果很好。所以它似乎只是 Python3.3 中的错误。添加为问题:http ://bugs.python.org/issue17408#

0 投票
1 回答
163 浏览

c++ - 在 C++ 中嵌入 python,我需要安装 python

将 python 嵌入到 C++ 应用程序中时,使用

并链接 -lpython2.6

目标计算机(运行最终编译程序的计算机)是否需要安装 python 才能使用我的应用程序?

谢谢

0 投票
1 回答
130 浏览

c++ - python嵌入后类型转换为结构

我在 C++ 程序中嵌入了一个小的 python 脚本。在将 python 对象暴露给 C++ 程序并将值复制到 C++ 变量后,我尝试将其类型转换为结构,但我没有得到预期的值。这里有什么问题?] 我正在使用 python 进行套接字编程以将数据从一个系统发送到另一个系统。

代码看起来像这样。

但是输出与分配的值不同。谁能解释什么是错的?

提前致谢。

0 投票
1 回答
146 浏览

c++ - Python嵌入项目中的VC ++ 6“未解决的外部”

我在 Visual C++ 6 上遇到了这个奇怪的链接器错误(我没有选择该工具)。我什至不知道从哪里开始看这个(我的 C++ 经验有限)。这些是错误:

这是CPythonPg.h

这是CSripting.h:(我没有创建这个类,除了将实例添加到我的类 CPythonPg 之外,我无法更改它)

什么可能导致这种类型的错误?

编辑:修正了一些错别字。

0 投票
1 回答
3522 浏览

boost-python - Boost python,使用命名空间调用函数对象

我正在使用 boost python 在我的 C++ 应用程序中嵌入 python。

我希望能够调用 boost python 函数对象,并将全局名称空间与该函数调用相关联。具体来说,简化后的相关代码为:

我知道当我使用 boost python exec() 函数时,我可以在全局命名空间中发送,如上所示。我的问题是当我调用 py_fn 时如何将 main_namespace 与 python 函数相关联?我的最终目标是将来自 runPyProg 的局部变量放在 main_namespace 中。

谢谢你。

0 投票
2 回答
2591 浏览

c++ - boost python,使用除 main global 之外的命名空间

我正在使用 boost python 将 python 嵌入到我的 C++ 应用程序中。我是一名 C++ 程序员,对 Python 的了解非常有限。

我有一个 C++ 类,PyExpression. 此类的每个实例都有一个字符串expStr,它是一个简短的用户输入(在运行时)python 程序,通过调用来执行boost::python::exec。简而言之,我将其设置为:

其中mainmain_namespace是 C++ 类的成员PyExpression

这里的问题是,不同的 C++ 实例PyExpression修改了相同的全局 python 命名空间,main_namespace我希望每个PyExpression实例都有自己的“全局”命名空间。

如果我通过boost::python::dict class_dict而不是main_namespace上面,它在基本级别上工作。但是如果PyExpression::expStr导入一个模块,例如import sys,那么我会得到一个ImportError. 此外,使用class_dict, 我不能再调用globals(), locals(), vars(), 因为它们都变得未定义。

我也尝试过暴露PyExpression为 python 模块。简要地,

不幸的是,使用PyExp_namespace,当要执行的字符串导入 python 模块时,我再次得到 ImportError ,并且再次,命名空间在所有实例之间共享PyExpression

简而言之,我希望能够使用命名空间对象/字典,最好是 的类成员PyExpression,只有该实例PyExpression可以访问命名空间,并且命名空间可以像全局命名空间一样使用其他模块导入,并且 `globals(), locals(), vars() 都已定义。

如果有人能指出我的工作代码草图,我将非常感激。我找不到关于这个问题的相关材料。

0 投票
1 回答
255 浏览

python-c-api - 嵌入时python函数的动态arg类型

我正在向 Exim 添加一个嵌入式 python 解释器。我已经复制了嵌入式 perl 接口,并希望 python 与长期以来编码的嵌入式 perl 解释器一样工作。目标是允许系统管理员使用强大的脚本语言(即python)执行复杂的功能,而不是尝试使用exim 的标准ACL 命令,因为使用exim ACL 语言执行相对简单的事情会变得相当复杂。

在撰写本文时,我当前的代码位于http://git.exim.org/users/tlyons/exim.git/blob/9b2c5e1427d3861a2154bba04ac9b1f2420908f7:/src/src/python.c。它可以正常工作,因为它可以导入系统管理员的自定义 python 代码,调用其中的函数,并处理返回值(仅限简单返回类型:int、float 或 string)。但是,它还没有处理传递给 python 函数的值,这是我的问题开始的地方。

Python 似乎要求使用 c api 将我传递给嵌入式 python 函数的任何参数显式转换为 int、long、double、float 或 string 之一。问题是系统管理员可以在嵌入的 python 代码和 exim 的 c 方面放入任何东西,我不知道这些变量类型是什么。我知道 python 是动态类型的,所以我希望在将值传递给嵌入式代码时保持这种合规性。但在我的测试中它不是这样工作的。

使用以下基本的超简单 python 代码:

...而我的 exim ACL 语言的调用代码是:

在下面的 c 代码中,为简洁起见,省略了引用计数。 count是我传递的参数数量:

是的,**arg 是一个指向字符串数组的指针(在这个简单的例子中是两个字符串)。问题是这两个值在 python 代码中被视为字符串,因此该 c 代码执行嵌入式 python 的结果是:

如果我将python更改为:

然后该 c 代码执行 python 代码的结果与预期的一样:

我的目标是我不想强迫 python 用户手动将他们传递给嵌入式 python 函数的所有数字参数强制转换。如果有一个 PyDynamicType_FromString(),而不是 PyString_FromString(),我会欣喜若狂。Exim 的嵌入式 perl 解析 args 并自动进行转换,我希望嵌入式 python 也能做到这一点。任何人都可以建议 python 是否可以执行此 arg 解析以提供我期望的动态类型?

或者,如果我想保持这种动态类型,我唯一的选择是解析每个 arg 并猜测将其转换为的类型吗?我真的真的真的很希望避免这种方法。如果涉及到这一点,我可能只是记录“所有传递的参数都是字符串,所以如果你真的想传递数字,你必须用 int()、float()、double() 或 long() 转换所有参数” . 然而,后面总是有一个逗号,我觉得这种方法会使我的实现中强大的 python 编码器变得糟糕。我也想避免这种情况。

除了“将您的应用程序变成 python 模块”之外,任何和所有建议都将受到赞赏。

0 投票
2 回答
6377 浏览

python - 带有关键字参数的 PyObject_CallMethod

我试图在我的 C 应用程序中嵌入一个 Python (2.7) 库,并且我正在使用 Python/C API 从 C 调用 Python 代码。我需要调用一个接受关键字参数的 Python 方法。从语义上讲,我试图在 Python 中实现与以下行等效的内容:

通过阅读文档,我设法做到了以下几点,但这并没有传递关键字参数:

我对 Python 不是很熟悉,我有点卡在这一点上,因为文档对此并不完全清楚,而且谷歌搜索也没有找到太多有用的信息。我会很感激任何帮助。