2016-08-12 469 views
0

我编写了使用模块lxml的python测试代码。导入lxml模块导致PyImport_ImportModule失败

我想在C++中调用foo

如果我添加了from lxml import html,但效果很好,当我删除它

Test.py

import os 
import sys 
import requests 
from lxml import html  #it will cause failed 

def foo(): 
    host = "http://www.baidu.com" 
    s = requests.session() 
    res = s.get(host) 
    return res 

C++代码将在步骤PyImport_ImportModule失败:

Py_Initialize(); 
PyRun_SimpleString("import sys"); 
PyRun_SimpleString("sys.path.append('./')"); 
PyObject* pModule = PyImport_ImportModule("Test"); //failed 
if (pModule == NULL || PyErr_Occurred()) 
{ 
    PyErr_Print(); 
} 
PyObject* pDict = PyModule_GetDict(pModule); 
PyObject *pFunHi = PyDict_GetItemString(pDict, "foo"); 
PyObject *ret = PyObject_CallFunction(pFunHi,NULL); 
Py_DECREF(pFunHi); 
Py_Finalize(); 

错误味精:

Traceback (most recent call last): 
File "C:\Users\Administrator\Desktop\test\Test\Debug\Test.py", line 4, in <module> 
from lxml import html 
File "E:\python27\lib\site-packages\lxml\html\__init__.py", line 54, in <module> 
from .. import etree 
ImportError: DLL load failed: Unable to find the specified module。 

如何使用lxml模块正确?如果pModule == NULL

+0

你应该检查'pModule == NULL'或者是否发生错误。如果有帮助,请参阅我最近的[回复](http://stackoverflow.com/questions/38745999/embedding-python-in-c-segmentation-fault/38791595#38791595)。 –

+0

您应该验证lxml是否已正确安装。 –

回答

0

您的代码将崩溃在

PyObject* pModule = PyImport_ImportModule("Test"); 
PyObject* pDict = PyModule_GetDict(pModule); //will crash 

。你应该检查返回值,例如

if (pModule == NULL || PyErr_Occurred()) { 
    PyErr_Print(); 
} 

的问题指出,该模块的文件名是test.py但随后在代码的模块名称是Test,即PyImport_ImportModule("Test")。案件应该匹配。

要验证LXML是否安装正确:

import lxml # does not fail if lxml has been partially installed 
import lxml.etree # fails if C extension part of lxml has not been installed 

如果是后者导入失败,LXML可能没有正确安装。

+0

**我评论你关注,我真的不知道如何在评论中使用降价,我多次测试,它不会生效。 ** – magicdmer

+0

我测试“import lxml.etree”,它失败了。 “import lxml”是可以的。我安装lxml使用msi包。也许正如你所说,lxml的c扩展部分尚未安装。我是python的新手,我不知道c扩展部分是什么,以及如何确保安装c扩展,你可以给我一些建议 – magicdmer

+0

我直接在cmd中运行Test.py,它运行良好 – magicdmer