现在我有一个名为“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。 任何和所有的想法将是非常感谢。谢谢!在
我不知道从C++调用Python,但是在Python中动态调用管理命令的方式是使用^{} 。使用它可能会让事情变得更容易。在
相关问题 更多 >
编程相关推荐