导入lxml模块导致PyImport_ImportModule失败

时间:2016-08-12 16:13:55

标签: python html c++ import lxml

我编写了python测试代码,它使用模块lxml

我想在c ++中调用foo

如果我添加PyImport_ImportModule,它将在步骤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 ++代码:

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模块?

2 个答案:

答案 0 :(得分:0)

您的代码将在

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

如果pModule == NULL。您应该检查返回值,例如

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。

答案 1 :(得分:0)

我解决了,这是lxml安装程序的错误。

我从https://pypi.python.org/pypi/lxml/3.6.0(lxml-3.6.0.win32-py2.7.exe)下载版本3.6.0,因为它没有版本3.6.1安装程序。它引起了我提到的问题。

所以我从http://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml(lxml-3.6.1-cp27-cp27m-win32.whl)下载了一个新的whl安装程序并更新了旧的安装程序。一切都好。