1、问题的由来
在绝大多数的文章中vc调用python的函数传递的参数都是确定的值,通过Py_BuildValue(“s”,“12334”),这样的形式实现的,有时候我们想传递一个可变的参数
如有个vc的界面输入一段内容,将这段内容通过python的函数显示出来。
2、第一版本
下面是完整代码:
// test.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <Python.h>
#include <windows.h>
#include <string>
using namespace std;
PyObject* StringToPyByWin(std::string str)
{
int wlen = ::MultiByteToWideChar(CP_ACP, NULL, str.c_str(), int(str.size()), NULL, 0);
wchar_t* wszString = new wchar_t[wlen + 1];
::MultiByteToWideChar(CP_ACP, NULL, str.c_str(), int(str.size()), wszString, wlen);
wszString[wlen] = '\0';
PyObject* pobj = PyUnicode_FromUnicode((const Py_UNICODE*)wszString, wlen);
delete wszString;
return pobj;
}
int _tmain(int argc, _TCHAR* argv[])
{
char ss[100];
Py_Initialize();
PyObject * pModule = PyImport_ImportModule("1");
PyObject * pFunc = PyObject_GetAttrString(pModule, "Hello");
char *p = (char *)malloc(100);
memset(p, 0, 100);
scanf("%s",&ss);///弹出输入框,输入要通过python显示的内容
printf("输入的内容是:%s\n",ss);
PyObject * pArgs = StringToPyByWin(ss);///将字符串的内容转换为PyObject对象
PyObject * t = PyTuple_New(1);
//PyTuple_SetItem(t, 0, Py_BuildValue("s", "11111"));
PyTuple_SetItem(t, 0, pArgs);
//下面调用函数
//PyEval_CallObject(pFunc, t);
PyObject_CallObject(pFunc, t);
Py_Finalize();
return 0;
}
3、简化版本
其实上面本来是在python中用来显示中文的,所以不需要那么繁琐,关键就是PyUnicode_fromUnicode这个函数,于是想到了使用PyUnicode_FromString这个函数返回一个PyObject对象,于是就有了下面的代码。
#include "stdafx.h"
#include <Python.h>
int _tmain(int argc, _TCHAR* argv[])
{
char ss[100];
Py_Initialize();
PyObject * pModule = PyImport_ImportModule("1");
PyObject * pFunc = PyObject_GetAttrString(pModule, "Hello");
scanf("%s",&ss);
printf("输入的内容是:%s\n",ss);
//PyObject * pArgs = StringToPyByWin(ss);
PyObject * pArgs = PyUnicode_FromString(ss);//将字符转换为Unicode编码并返回PyObject对象
PyObject * t = PyTuple_New(1);
//PyTuple_SetItem(t, 0, Py_BuildValue("s", "11111"));
PyTuple_SetItem(t, 0, pArgs);
//下面调用函数
PyEval_CallObject(pFunc, t);
//PyObject_CallObject(pFunc, pArgs);
Py_Finalize();
return 0;
}
4、运行结果
运行结果如下:
5、python源码
python源码如下: