2016-08-12 178 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