在C+中嵌入Python+;。接收列表的字符串的传递向量 我有一个用C++编写的Windows应用程序。我有一个字符串向量,需要传递给python脚本进行处理。我知道如何用简单的方式在C++中嵌入Python,但我正在研究如何创建一个等价于字符串向量的Python对象。我看到的是: for (size_t i = 0; i < myvector.size(); ++i) { PyUnicode_FromString.append(myvector[i]); } for(size_t i=0;i

在C+中嵌入Python+;。接收列表的字符串的传递向量 我有一个用C++编写的Windows应用程序。我有一个字符串向量,需要传递给python脚本进行处理。我知道如何用简单的方式在C++中嵌入Python,但我正在研究如何创建一个等价于字符串向量的Python对象。我看到的是: for (size_t i = 0; i < myvector.size(); ++i) { PyUnicode_FromString.append(myvector[i]); } for(size_t i=0;i,python,c++,vector,embedding,python-c-api,Python,C++,Vector,Embedding,Python C Api,或许 for (size_t i = 0; i < myvector.size(); ++i) { pValue = PyUnicode_FromString(myvector[i]); pyTuple_SetItem(myvector.size(), i, pValue); } for(size_t i=0;i

或许

for (size_t i = 0; i < myvector.size(); ++i)
{
    pValue = PyUnicode_FromString(myvector[i]);
    pyTuple_SetItem(myvector.size(), i, pValue);
}
for(size_t i=0;i

向量几乎不会变得非常大(我想最多100项)。目前,我正在保存一个文本文件,我让python脚本打开并处理它,这显然不是很好,但它告诉我,其他一切都按计划进行。Python脚本的处理为每个项生成4个值(3个字符串和1个整数(长))。我还需要把这个主C++程序还给我,我不知道该怎么做。(编辑)在审查可能的选项之后,我正在考虑一个列表(因为字典没有排序,需要更多的解析操作)应该做这个把戏,但是我不知道我会如何去解码这个在C++程序里面的(现在是用文件写/读来完成的,所以我知道它是有效的)。如果有人已经这样做了,请您提供一些小的代码片段,以便我可以根据自己的需要对其进行调整。我还应该提到,我不能使用boost库(最好也不要使用SWIG)——因此,基本上是用pythonc-API完成的。我所看到的所有关于子流程或NumPy的讨论的例子,我不相信(可能是错误的)适用于我的案例。

好吧,我设法找到了我想要的。下面是一个充分发挥作用的例子,说明了我在尝试做什么。但是,答案并不完整,因为缺少了很多错误检查,更重要的是缺少了一些Py_DECREF。我会尽力抓住他们,并在我发现的时候进行更新,但如果能有一个精通这类事情的人能帮上忙,我将不胜感激。下面是:

Python脚本:(testingoutput.py)该脚本接收字符串列表,对于每个字符串,它返回3个随机字符串(来自提供的列表)和一个随机整数。格式为:[[sssi],]

import random
import string

def get_list_send_list(*input_list):  
    outer_list = []   
    for key in input_list:        
        inner_list = []
        # from here, your program should produce the data you want to retrieve and insert it    in a list
        # for this example, a list comprised of 3 random strings and 1 random number is returned
        for i in range (0, 3):
            some_words = random.choice(["red", "orange", "yellow", "green", "blue", "purple", "white", "black"])
            inner_list.append(some_words)        
        inner_list.append(random.randint(1,10))
        outer_list.append(inner_list)
    return outer_list
这是cpp文件。基本上与Python C API示例相同,但稍作修改以适应列表。我不需要我的需要,但我把一些类型检查这里和那里的利益,任何人可能需要这样的事情

#include <Python.h>
#include <iostream>
#include <vector>

int main(int argc, char *argv[])
{
    PyObject *pName, *pModule, *pFunc;
    PyObject *pArgs, *pValue;
    PyObject *pList, *pListItem, *pyString; 

    char* strarray[] = {"apple", "banana", "orange", "pear"};
    std::vector<std::string> strvector(strarray, strarray + 4);
    std::string pyFile = "testingoutput";
    std::string pyFunc = "get_list_send_list";

    Py_Initialize();
    pName = PyUnicode_FromString(pyFile.c_str());
    /* Error checking of pName left out */

    pModule = PyImport_Import(pName);
    Py_DECREF(pName);

    if (pModule != NULL)
    {
        pFunc = PyObject_GetAttrString(pModule, pyFunc.c_str());
        /* pFunc is a new reference */

        if (pFunc && PyCallable_Check(pFunc)) {
            pArgs = PyTuple_New(strvector.size());
      for (size_t i = 0; i < strvector.size(); ++i)
            {
                pValue = PyUnicode_FromString(strvector[i].c_str());
                if (!pValue)
                {
                    Py_DECREF(pArgs);
                    Py_DECREF(pModule);
                    fprintf(stderr, "Cannot convert argument\n");
                    return 1;
                }
                /* pValue reference stolen here: */         
                PyTuple_SetItem(pArgs, i, pValue);
            }           

            pValue = PyObject_CallObject(pFunc, pArgs);
            Py_DECREF(pArgs);

      if (pValue != NULL)
      {
    int py_list_size = PyList_Size(pValue);
    int sub_list_size = 0;
    std::cout << "Retrieving content..."<< "\n";
    for(Py_ssize_t i = 0; i < py_list_size; ++i)
    {
        pList = PyList_GetItem(pValue, i);
        sub_list_size = PyList_Size(pList);
        // verify if the subitem is also a list - if yes process it
        if(PyList_Check(pList))
        {
            std::cout << "********** " << i << " **********\n";
            for(Py_ssize_t j = 0; j < sub_list_size; ++j)
            {
                pListItem = PyList_GetItem(pList, j);
                // verify if the item is a string or a number
                if(PyUnicode_Check(pListItem))
                {
                     // "Error ~" does nothing here but it should be defined to catch errors
                     pyString = PyUnicode_AsEncodedString(pListItem, "utf-8", "Error ~");
                     const char *tmpCstChar =  PyBytes_AS_STRING(pyString);
                     std::cout << "Item " << j << ": " << tmpCstChar << "\n";
                 }
                 else if(PyLong_Check(pListItem))
                 {
                     int pyNumber = PyLong_AsLong(pListItem);
                     std::cout << "Item " << j << ": " << pyNumber << "\n";
                 }
             }
         }
         else
         {
             std::cout << "This item is not a list\n";
         }
     }
     Py_DECREF(pValue);
     }
            else
            {
                Py_DECREF(pFunc);
                Py_DECREF(pModule);
                PyErr_Print();
                fprintf(stderr,"Call failed\n");
                return 1;
            }
        }
        else
        {
            if (PyErr_Occurred())
                PyErr_Print();
            fprintf(stderr, "Cannot find function \"%s\"\n", argv[2]);
        }
        Py_XDECREF(pFunc);
        Py_DECREF(pModule);
    }
    else
    {
        PyErr_Print();
        fprintf(stderr, "Failed to load \"%s\"\n", argv[1]);
        return 1;
    }
    Py_Finalize();
    return 0;
}
#包括
#包括
#包括
int main(int argc,char*argv[])
{
PyObject*pName、*pModule、*pFunc;
PyObject*pArgs,*pValue;
PyObject*pList、*pListItem、*pyString;
char*strarray[]={“苹果”、“香蕉”、“橘子”、“梨”};
std::向量strvector(strarray,strarray+4);
std::string pyFile=“testingoutput”;
std::string pyFunc=“获取\发送\列表”;
Py_初始化();
pName=PyUnicode_FromString(pyFile.c_str());
/*检查遗漏的pName时出错*/
pModule=PyImport\u Import(pName);
Py_DECREF(pName);
if(pModule!=NULL)
{
pFunc=PyObject_GetAttrString(pModule,pyFunc.c_str());
/*pFunc是一个新的参考*/
if(pFunc&&PyCallable_检查(pFunc)){
pArgs=PyTuple_New(strvector.size());
对于(size_t i=0;istd::cout在
处为我崩溃,无法加载“P�“`使用
导入错误:不支持按文件名导入。