嵌入式python问题

Posted

技术标签:

【中文标题】嵌入式python问题【英文标题】:Embedded python issue 【发布时间】:2017-09-17 13:45:34 【问题描述】:

我完全是 Python 和嵌入式 Python 的新手。

当尝试从 C++ 运行一些基本的 python 命令时,似乎我的一些导入在 C++ 中不起作用,但当我从 python shell 运行它们时它们确实起作用。

这是我尝试运行的基本指令。

import sys
sys.path.insert(0, 'c:/svapp/')
sys.path.insert(0, 'c:/svapp/test')


from common import baseaccess
from debug.domains.pm import pm_tools

在我的 C++ 文件中,它看起来像这样:

int main()

    Py_SetProgramName("myPythonProgram");
    Py_Initialize();
    PyRun_SimpleString("import sys,os");
    PyObject *sys_path = PySys_GetObject("path");

    PyList_Append(sys_path, PyString_FromString("c:\\svapp"));
    PyList_Append(sys_path, PyString_FromString("c:\\svapp\\test"));
    PyObject * commonModule = PyImport_ImportModule("common");
    PyObject * debugDomainsModule = 
    PyImport_ImportModule("debug.domains.pm.pm_tools");


通用模块似乎加载得很好,但是当我尝试加载 debug.domains.pm.pm_tools 时,它似乎导入了一些内部导入。

错误的跟踪以 :

结尾

文件“C:\Python27\lib\site-packages\namednodes__init__.py”,第 30 行,在 从 。导入设置 ImportError: 无法导入名称设置

你能指出我正确的方向吗? 为什么这只能通过嵌入式 C++ 应用程序发生?

提前感谢您提供的任何帮助。

【问题讨论】:

不确定 pm_tools 是什么,但是,如果它是一个符号而不是一个包,那么可能是由于您导入它的方式不同。在一种情况下您使用导入,在另一种情况下您使用“from”,其行为方式相似但不同 感谢您的评论。我能够发现问题是由于一些 python 本机导入需要 argv[''] 参数。将此参数添加到 sys.path 后,一切都像魅力一样。 写答案怎么样?也许有人可以从中受益。 显然,正如我之前的回答中提到的,这是导致 python2.7 namednodes 包行为不端的部分: PyRun_SimpleString("sys.argv = ['']");将此行添加到我的嵌入式代码中解决了这个问题。 【参考方案1】:Py_Initialize之前致电Py_SetPathPy_Initialize之前将Py_IgnoreEnvironmentFlag设置为1

Windows 上的Py_SetPath 使用; 作为路径分隔符。在其他平台上是:

【讨论】:

以上是关于嵌入式python问题的主要内容,如果未能解决你的问题,请参考以下文章

如何将数组从 C 传递到嵌入式 python 脚本

虚拟环境和嵌入 Python

Python GIL:并发 C++ 嵌入

Python - C 嵌入式分段错误

以编程方式在嵌入式 python 3 中定义包结构

使用 Boost::Python 从嵌入式 python 中提取数据