小编Fri*_*itz的帖子

嵌入式Python 2.7.2从用户定义的目录导入模块

我将Python嵌入到将具有已定义API的C/C++应用程序中.

应用程序需要实例化脚本中定义的类,这些类的结构大致如下:

class userscript1:
    def __init__(self):
        ##do something here...

    def method1(self):
        ## method that can be called by the C/C++ app...etc
Run Code Online (Sandbox Code Playgroud)

我过去曾经管理过(为了概念验证)使用以下类型的代码完成这项工作:

PyObject* pName = PyString_FromString("userscript.py");
PyObject* pModule = PyImport_Import(pName);
PyObject* pDict = PyModule_GetDict(pModule);
PyObject* pClass = PyDict_GetItemString(pDict, "userscript");
PyObject* scriptHandle = PyObject_CallObject(pClass, NULL);
Run Code Online (Sandbox Code Playgroud)

现在我处于更多的生产环境中,这在PyImport_Import行失败了 - 我想这可能是因为我正在尝试将目录添加到脚本名称中,例如

PyObject* pName = PyString_FromString("E:\\scriptlocation\\userscript.py");
Run Code Online (Sandbox Code Playgroud)

现在,为了让您了解我尝试过的内容,我尝试在所有这些调用之前修改系统路径以使其搜索此模块.基本上尝试以编程方式修改sys.path:

PyObject* sysPath = PySys_GetObject("path");
PyObject* path = PyString_FromString(scriptDirectoryName);
int result = PyList_Insert(sysPath, 0, path);
Run Code Online (Sandbox Code Playgroud)

这些行运行正常,但对我的代码工作没有任何影响.显然,我的真实代码有一大堆错误检查,我已经排除了所以不要担心!

所以我的问题是:如何将嵌入式解释器适当地引导到我的脚本中以便我可以实例化类?

c c++ python python-embedding python-c-api

8
推荐指数
1
解决办法
4029
查看次数

如何从C++中具有复杂结构的文件中有效地读取二进制数据

我正在编写一段代码来读取使用C++ IOStreams跨越多个文件的几GB数据,我已经选择了C API,出于一些我不会厌烦你的设计原因.由于数据是由我的代码运行的同一台机器上的单独程序生成的,因此我相信,大多数情况下,可以忽略与endianess相关的问题.

这些文件具有相当复杂的结构.例如,有一个标题描述了特定二进制配置的记录数.稍后在文件中,我必须使代码有条件地读取该行数.这种模式以复杂但记录良好的方式重复出现.

我的问题与如何有效地做到这一点有关 - 我确信我的过程将受IO限制,所以我的直觉是不是在小块中读取数据,例如以下方法

std::vector<int> buffer;
buffer.reserve(500);
file.read( (char*)&buffer[0], 500 * sizeof(int));
Run Code Online (Sandbox Code Playgroud)

我应该一次完全读取一个文件并尝试在内存中处理它.所以我相互关联的问题:

  • 鉴于这似乎意味着读取char*或std :: vector数组,您最好如何将此数组转换为正确表示文件结构所需的数据格式?
  • 我的假设不正确吗?

我知道显而易见的答案是尝试然后稍后进行分析,然后我肯定会这样做.但是这个问题更多的是关于如何在开始时选择正确的方法 - 一种"选择正确的算法"优化,而不是在稍后识别瓶颈后我可以设想的那种优化!

我会对提供的答案感兴趣 - 我倾向于只能找到相对简单的二进制文件的答案,上面的方法是合适的.我的问题是大部分二进制数据是有条件地结构化文件头中的数字(即使标题是这样格式化的!)所以我需要能够更仔细地处理文件.

提前致谢.

编辑: 关于内存映射的一些评论 - 看起来不错,但不知道怎么做,我读过的所有内容都告诉我它不可移植.我有兴趣尝试mmap,但也有更便携的解决方案(如果有的话!)

c++ binary performance binaryfiles

3
推荐指数
1
解决办法
1603
查看次数