使用Python.h从C++调用Django

2024-09-30 22:28:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要从C++调用Django函数,并在C++代码中得到它们的输出。 如您所知,Django用于调用管理.pyPython脚本,其中需要的函数作为第一个参数,后面是参数。在

现在我有一个名为“test”的测试函数,它返回一个JSON格式的字符串。在

因此,如果我打电话:

    python manage.py test

我得到以下信息:

^{pr2}$

要在cpp中获取此信息,我可以:

   system(python path.../manage.py test);

捕捉输出。但我不喜欢。我也可以用Boost.Python. 我也不喜欢。在

<>我希望能够在C++和Python中做这件事,只考虑大小和速度方面的考虑。在

这是管理.py我在跑步:

   import os
   import sys

   sys.path.append('C:\ds')

   if __name__ == "__main__":
       os.environ.setdefault("DJANGO_SETTINGS_MODULE", "frontoffice.settings")

   from django.core.management import execute_from_command_line
   execute_from_command_line(sys.argv)

如果我添加一个print sys.argv我得到以下输出:['manage.py', 'test']。在

所以我设法用一种令人讨厌的方式来做这件事:

   bool initPython()
   {
       Py_Initialize();

       int check = 0;

       check = PyRun_SimpleString("import sys");
       check = PyRun_SimpleString("import os");
       check = PyRun_SimpleString("sys.path.append('C:\\ds')");
       check = PyRun_SimpleString("os.environ.setdefault(\"DJANGO_SETTINGS_MODULE\", \"frontoffice.settings\")");
       check = PyRun_SimpleString("from django.core.management import execute_from_command_line");

       if(check == 0) return true;
       else return false;
   }

   std::string execPythonCommand(std::string cmd)
   {
       std::string command = std::string("robin = ['dontreallycarewhatitis',       '").append(cmd).append("']");

       PyRun_SimpleString(command.c_str());
       PyRun_SimpleString("execute_from_command_line(robin)");
   }

没什么特别的。具有跨平台的优势,但捕获输出是一个混乱的过程,所以它是有效的,但这不是我要找的。我希望能够直接从_comand_line命令获得execute_的输出。在

这是我到目前为止的想法。运行initPython()后:

    PyObject* executeCmd = PyImport_Import(PyString_FromString("django.core.management"));
    PyObject* executeFunc = PyObject_GetAttrString(executeCmd, "execute_from_command_line");

    std::cout << "Imported function." << " isNULL: " << (executeFunc == NULL) << " isExecutable: " << PyCallable_Check((executeFunc)) << std::endl;

所以我设法从命令行函数execute_得到一个Cpp对象,它是可调用的。这就是问题的症结所在。我怎么称呼它?在

在系统argv根据Python文档,是一个列表。所以我试着重现同样的东西,并称之为:

    PyObject* pRobin = PyList_New(2);
    PyObject* pString = PyString_FromString("test");
    PyObject* pString0 = PyString_FromString("manage.py");
    PyList_Append(pRobin,pString0);
    PyList_Append(pRobin,pString);

    PyObject* pValue = PyObject_CallObject(executeFunc, pRobin);
    //PyObject* pValue = PyObject_CallFunctionObjArgs(executeFunc, pRobin, NULL); //Doesn't work either

现在我什么都试过了。使用元组而不是列表,PyErr_Print()没有给我任何显式的信息。我真的不是Python专家,我正在努力解决这个问题。如何让pValue存储测试例程的输出JSON字符串?在

仅供参考:

    >>> inspect.getargspec(django.core.management.execute_from_command_line)
    ArgSpec(args=['argv'], varargs=None, keywords=None, defaults=(None,))

到时候我就得跑了管理.pyxxx(其中xxx是一个命令)频繁且快速,所以我真的希望使用C/API,而不是做一些讨厌的stdio捕捉。在

仅供参考,后面是VS2012、windows8、python2.7和PostGRE。 任何和所有的想法将是非常感谢。谢谢!在


Tags: frompytestimportexecutechecksysline
1条回答
网友
1楼 · 发布于 2024-09-30 22:28:07

我不知道从C++调用Python,但是在Python中动态调用管理命令的方式是使用^{}。使用它可能会让事情变得更容易。在

相关问题 更多 >