python — импорт модуля lxml вызывает ошибку PyImport_ImportModule

Я написал тестовый код Python, который использует модуль lxml,

Я хочу позвонить 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?

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 установлен неправильно.

0

Другие решения

Я решил, это ошибка установщика lxml.

Я скачиваю версию 3.6.0 с https://pypi.python.org/pypi/lxml/3.6.0 (lxml-3.6.0.win32-py2.7.exe), поскольку у него не было установщика версии 3.6.1. и это вызвало вопрос, который я упомянул.

поэтому я загружаю новый установщик whl из http://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml (lxml-3.6.1-cp27-cp27m-win32.whl) и обновите старый. Все нормально.

0

По вопросам рекламы [email protected]