python中 import的错误提示,请教高手!!!

作者&投稿:良万 (若有异议请与网页底部的电邮联系)
请教高手,我在C/C++中嵌入python,用PyImport~

#include #include using namespace std; void HelloWorld(); void Add(); void TestTransferDict(); void TestClass(); int main() { cout << "Starting Test..." << endl; cout << "HelloWorld()-------------" << endl; HelloWorld(); cout << "Add()--------------------" << endl; Add(); cout << "TestDict-----------------" << endl; TestTransferDict(); cout << "TestClass----------------" << endl; TestClass(); system("pause"); return 0; } //调用输出"Hello World"函数 void HelloWorld() { Py_Initialize(); //使用python之前,要调用Py_Initialize();这个函数进行初始化 PyObject * pModule = NULL; //声明变量 PyObject * pFunc = NULL; //声明变量 pModule =PyImport_ImportModule("Test001"); //这里是要调用的Python文件名 pFunc= PyObject_GetAttrString(pModule, "HelloWorld"); //这里是要调用的函数名 PyEval_CallObject(pFunc, NULL); //调用函数,NULL表示参数为空 Py_Finalize(); //调用Py_Finalize,这个和Py_Initialize相对应的. } //调用Add函数,传两个int型参数 void Add() { Py_Initialize(); PyObject * pModule = NULL; PyObject * pFunc = NULL; pModule =PyImport_ImportModule("Test001"); //Test001:Python文件名 pFunc= PyObject_GetAttrString(pModule, "add"); //Add:Python文件中的函数名   //创建参数: PyObject *pArgs = PyTuple_New(2); //函数调用的参数传递均是以元组的形式打包的,2表示参数个数 PyTuple_SetItem(pArgs, 0, Py_BuildValue("i", 5));//0---序号 i表示创建int型变量 PyTuple_SetItem(pArgs, 1, Py_BuildValue("i", 7));//1---序号   //返回值 PyObject *pReturn = NULL; pReturn = PyEval_CallObject(pFunc, pArgs); //调用函数   //将返回值转换为int类型 int result; PyArg_Parse(pReturn, "i", &result); //i表示转换成int型变量 cout << "5+7 = " << result << endl; Py_Finalize(); } //参数传递的类型为字典 void TestTransferDict() { Py_Initialize(); PyObject * pModule = NULL; PyObject * pFunc = NULL; pModule =PyImport_ImportModule("Test001"); //Test001:Python文件名 pFunc= PyObject_GetAttrString(pModule, "TestDict"); //Add:Python文件中的函数名   //创建参数: PyObject *pArgs = PyTuple_New(1); PyObject *pDict = PyDict_New(); //创建字典类型变量 PyDict_SetItemString(pDict, "Name", Py_BuildValue("s", "WangYao")); //往字典类型变量中填充数据 PyDict_SetItemString(pDict, "Age", Py_BuildValue("i", 25)); //往字典类型变量中填充数据 PyTuple_SetItem(pArgs, 0, pDict);//0---序号 将字典类型变量添加到参数元组中   //返回值 PyObject *pReturn = NULL; pReturn = PyEval_CallObject(pFunc, pArgs); //调用函数   //处理返回值: int size = PyDict_Size(pReturn); cout << "返回字典的大小为: " << size << endl; PyObject *pNewAge = PyDict_GetItemString(pReturn, "Age"); int newAge; PyArg_Parse(pNewAge, "i", &newAge); cout << "True Age: " << newAge << endl; Py_Finalize(); } //测试类 void TestClass() { Py_Initialize(); PyObject * pModule = NULL; PyObject * pFunc = NULL; pModule =PyImport_ImportModule("Test001"); //Test001:Python文件名 pFunc= PyObject_GetAttrString(pModule, "TestDict"); //Add:Python文件中的函数名   //获取Person类 PyObject *pClassPerson = PyObject_GetAttrString(pModule, "Person"); //创建Person类的实例 PyObject *pInstancePerson = PyInstance_New(pClassPerson, NULL, NULL); //调用方法 PyObject_CallMethod(pInstancePerson, "greet", "s", "Hello Kitty"); //s表示传递的是字符串,值为"Hello Kitty" Py_Finalize(); }#test.py def HelloWorld(): print "Hello World" def add(a, b): return a+b def TestDict(dict): print dict dict["Age"] = 17 return dict class Person: def greet(self, greetStr): print greetStr #print add(5,7) #a = raw_input("Enter To Continue...")
结果:


配置:


注意两点:
若编译Debug版,请将C:/Python26/libs下的python26.lib复制一份改名为python26_d.lib

test.py 记得放项目的当前目录。


测试通过

拿出一个例子来分析一下,不就是总结吗?

#include

char* python_code1 = "\
import wx
\
f = wx.Frame(None, -1, 'Hello from wxPython!', size=(250, 150))
\
f.Show()
\
";
PyRun_SimpleString(python_code1);

char* python_code2 = "\
import sys
\
sys.path.append('.')
\
import embedded_sample
\

\
def makeWindow(parent):
\
win = embedded_sample.MyPanel(parent)
\
return win
\
";
PyObject* globals = PyDict_New();
PyObject* builtins = PyImport_ImportModule("__builtin__");
PyDict_SetItemString(globals, "__builtins__", builtins);
Py_DECREF(builtins);

// Execute the code to make the makeWindow function
result = PyRun_String(python_code2, Py_file_input, globals, globals);
// Was there an exception?
if (! result) {
PyErr_Print();
wxPyEndBlockThreads(blocked);
return NULL;
}
Py_DECREF(result);

// Now there should be an object named 'makeWindow' in the dictionary that
// we can grab a pointer to:
PyObject* func = PyDict_GetItemString(globals, "makeWindow");

程序没有问题。是运行方式的问题。

argv 是程序运行携带的参数。

如图:python  exp.py 111 222 就是携带111和222两个参数

而你是在交互模式下测试,相当于第2种运行方式,没有携带参数,所以返回默认的一个参数,也就是被运行的py文件路径。

回到你的问题。系统返回只有一个参数,你用了两个变量接收。所以解释器报错。

所以你要把代码保存到py文件,用命令模式运行它,才可以测试这个程序。



因为 argv 在这里期待一个tuple 或者 list,但是实际传入的数据格式不正确。

最好在出错一句的前面加一个信息输出:

print (argv)    # 确认输入的数据是正确的


吧错误提示贴全,代码也贴上来。

script, user_name=argv,argv2 #少一个参数



秀屿区18215973257: python中 import的错误提示,请教高手!!! -
历毅万汶: 程序没有问题.是运行方式的问题.argv 是程序运行携带的参数.如图:python exp.py 111 222 就是携带111和222两个参数 而你是在交互模式下测试,相当于第2种运行方式,没有携带参数,所以返回默认的一个参数,也就是被运行的py文件路径.回到你的问题.系统返回只有一个参数,你用了两个变量接收.所以解释器报错.所以你要把代码保存到py文件,用命令模式运行它,才可以测试这个程序.

秀屿区18215973257: python,import语法出错 -
历毅万汶: 还是 hello2.py 这个文件语法有错误.

秀屿区18215973257: python 使用from import正常,使用import报错,为什么 -
历毅万汶: 你好 python import模块时, 是在sys.path里按顺序查找的.sys.path是一个列表,里面以字符串的形式存储了许多路径.当你增加里新的放模块的目录时,可以 from sys import path path.append(r" 路径 ")

秀屿区18215973257: 笨办法学Python,习题25import出错 -
历毅万汶: 两种处理:1、切换到ex25.py的路径下,再import.切换路径命令:cd f:\pylearning 2、把ex25.py文件复制到python安装目录的lib文件夹下面,在任意位置都可以import

秀屿区18215973257: Python中import pyquery出错,提示如下,怎么回事 -
历毅万汶: 是不是这个错误?Traceback (most recent call last): .....ImportError: No module named lxml 如果是,解决办法如下:1. 检查你安装的 lxml的版本号.如果没安装,你安装的时候会遇见如下错误:Building lxml version 2.3.5.ERROR: 'xslt-config' is not...

秀屿区18215973257: python报错ImportError: cannot import name - ufuncs怎么解决 -
历毅万汶: 我import是没错,说明你安装scipy包的时候出错,windows可以到http://www.lfd.uci.edu/~gohlke/pythonlibs/#scipy,对应版本就可以了,可能是装的时候错...

秀屿区18215973257: python的import pandas报错 -
历毅万汶: 在最后加上engine='python'就可以了,即 users = pd.read_table('users.dat', sep='::',header = None, names = unames , engine = 'python')

秀屿区18215973257: python import email.Utils报错 -
历毅万汶: 检查你的Lib\email目录之下有没有utils.py和__init__.py文件.该目录在Python的主目录之下.

秀屿区18215973257: python import os 报错 -
历毅万汶: 这个不是引用os报错吧,感觉像是import os.但是却没有使用到这个os.IDE报的?贴个完整的代码和报错看看.

秀屿区18215973257: Python程序中 import websocket 报错 No module named websocket -
历毅万汶: import websocket 报错 No module named websocket 报这个错误有两点:1、没有安装websocket, 使用pip install websocket进行安装2、安装了,没有将安装的路径设置为环境变量

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网