问题标签 [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.
c++ - 将 Python 3.3 嵌入到 C++ 程序中,同时只能从输入中一次读取一行
作为暑期实习的一部分,我目前正在为大型程序添加嵌入式 Python 支持(是的,扩展不是一种选择)。理想情况下,我可以将 Python 支持保留在单个 .DLL 中,该 DLL 目前包含程序的内部脚本语言,并且是集成所述语言和 Python 的最简单的地方。
但是,由于程序的 API,我只有一个输入函数可以使用。此函数的返回值是当前输入的单行,可以是控制台或文件。输入接口不能(在 .DLL 中)转换为流对象、缓冲区或 FILE 指针。
我当前的测试代码(在程序之外编写,使用 std::string、istream 和 getline 来模仿限制)是
我没有遇到这个 hack 的严重问题,但它让我觉得非常不优雅。谁能想到更好的方法来做到这一点?
我已经和我的老板一起清理了 boost.python 库,如果这提供了一些让我无法理解的有用技巧的话。
编辑:我可能应该提到程序本身,虽然不是我微薄的测试平台,但必须在 MS Windows 上运行。
c++ - 嵌入 Python 3.3:如何访问 _PyParser_Grammar?
我正在尝试模拟 Python/C API 的 PyRun_InteractiveLoop() 函数,但来自我雇主使用的不同输入系统。Python FAQ ( http://docs.python.org/3/faq/extending.html#how-do-i-tell-incomplete-input-from-invalid-input ) 有以下代码,用于检查一个给定的字符数组是一个完整的 Python 块:
这会为 _PyParser_Grammar 提供未声明的变量错误。搜索 Python 源代码,我没有找到任何声明 _PyParser_Grammar 的标头。进一步看,我发现它被一些函数引用,特别是 metagrammar.c 中定义的 meta_grammar() 和 Py_meta_grammar()。
虽然 meta_grammar() 是在 pgen.h 中定义的,但尽管使用 -lpython3.3m 编译(我的测试代码为 g++),但它给出了一个未定义的符号错误。快速的 nm 显示 meta_grammar() 在 libpython3.3m.so 中不是可见符号,而 Py_meta_grammar() 是。但是,在搜索 Python 源代码时,我没有找到任何声明 Py_meta_grammar() 的头文件。
我错过了什么吗?这些符号在哪里声明/定义?
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
内部的实际工作方式使我无法理解。
也可能是我的问题是由完全不同的东西引起的。
谢谢你。
c++ - Microsoft Visual Studios 2012 无法打开“python33.lib”
我将 Microsoft Visual Studios 2012 中的 Boost 库用于将嵌入 Python 的 C++ 程序。问题是当我尝试构建解决方案 [F7] 时;我明白了::
Error 1 error LNK1104: cannot open file 'python33.lib' C:\Users\usr\Documents\Visual Studio 2012\Projects\ConsoleApplication1\ConsoleApplication1\LINK
问题是,我不知道这是什么,意味着什么,也不知道如何解决它。我已经尝试将我的 python 文件夹移动到我的桌面中,因为它最初位于 C:\ 中,我认为这可能是权限错误,但这并没有做任何事情。
这是我为准备项目而阅读的教程中的代码::
--Visual Studios 2012 --Windows 7 x64 --Python 3.3.2 --Boost 库 --Python Embedded C++ 程序
--链接到教程页面: http: //wiki.python.org/moin/boost.python/EmbeddingPython
c++ - 使用 Boost::Python::Object 会导致链接器错误
所以,我正在尝试将 Python 嵌入到 C++ 中。我已经走得很远了,并且已经能够做一些基本的事情,比如运行 Python 字符串。当我尝试使用 Boost::Python::Object 时,我开始收到这 4 个链接器错误。
我使用 BJAM 和 Boost 1.54.0 和 Python 2.7.5 构建了 boost。
Python Lib 构建命令:
最小代码示例:
链接器错误:
python - 在 python 代码中与使用 Qt Designer 创建的 MatplotlibWidget 交互
我在与我通过 Qt Designer 创建的 MatplotlibWidget 交互时遇到问题。我无法更改坐标轴标签、比例、提供标题或任何内容。我做错什么了吗?
这是使用 Qt Designer 生成的示例 UI 代码:
这是我为与 UI python 代码交互而编写的 python 代码:
python - Python - 从 C 调用 python 函数
我想从 C 函数调用 python 函数。我需要在 c 文件中导入 python 模块并调用我需要的函数,但在互联网上找不到任何关于这对我有帮助的信息,因为我实际上在 Python 项目和 C 项目之间进行了乒乓球。我只运行python项目。我在python模块中加载了C项目的库(dll),然后我在python中调用了一个来自C项目的函数(这部分工作得很好),然后在C项目中发生了一些事件和我想要的回调函数从 python 调用函数。知道怎么做吗?
在互联网上找到的示例http://www.daniweb.com/software-development/python/threads/31682/calling-python-function-from-cc在这种情况下不起作用,因为 python 解释器是已经初始化,当我尝试导入模块时它崩溃了......
谢谢!
python - 将 matplotlib 图表嵌入到 Qt/C++ 应用程序中
我正在使用 Qt/C++ 开发一个面向数学的 GUI 应用程序,并希望嵌入一个 Python 脚本,包括 NumPy 和 Matplotlib。使用 Python C API,我终于设法运行脚本,从 Python 变量中检索值,包括 NumPy 数组等。但我未能将 Matplotlib 图表绘制到我的 Qt/C++ 应用程序中。
最好说,我已经设法使用 Python 脚本将图表的 RGBA 缓冲区保存到变量中,然后将变量的值作为缓冲区类型的 PyObject 获取,获取缓冲区并将其转换为 QImage,然后转换为 QPixmap,最后放入它进入QLabel并显示它。
但是我仍然缺少它的交互行为,调整大小等。虽然它似乎可以通过将 Qt 鼠标事件转发到 figure.canvas.button_press_event 来完成,但它变得过于复杂......所以我得出结论我不明白这些原则的 Python 嵌入足够好。我错过了一些明显的东西。
我发现了一些将 matplotlib 图表嵌入到 PyQt 或 PySide(即用 Python 编写)应用程序中的示例,在这些应用程序中我看到了 QMainWindow.setCentralWidget(canvas) 或 layout.addWidget(canvas) 之类的东西。这里的画布是 FigureCanvasQTAgg 对象(http://matplotlib.org/api/backend_qt4agg_api.html)。
这表明画布继承自 QWidget。但是当我尝试使用 Python 的 C API 在 C++ 代码中模仿这一点时,我只以 PyObject *canvas 结束,不知道如何将其转换为 QWidget。这是我的片段,没有重要步骤:
正如我所写,我一定遗漏了一些明显的东西。我到处搜索,但没有成功。任何帮助将不胜感激。
python-3.x - 我应该使用哪个 API 来创建多个 Python3 解释器实例?
我将 Python3 解释器嵌入到 Cocoa 应用程序中。我的应用程序需要多个单独的 Python 执行上下文,因此我需要生成多个解释器。
Python3 手册提供了至少两种生成执行上下文的方法。
PyInterpreterState_New
Py_NewInterpreter
它们是什么,我应该使用哪个来创建完全分离的 python 上下文?(就像一个系统进程)
c++ - Boost python,嵌入时从python调用c++函数
我目前有以下内容:
我试图打电话给 f,但我不确定让它工作所需的胶水。我可以上课
但是boost::python::def
似乎没有返回喜欢boost::python::object
的东西class_
我的问题是,如何让第一个测试用例按预期工作?其次,我在第二个代码片段“正确”中公开我的类型的方式是什么?