2016-08-12 24 views
0

モジュールlxmlを使用するpythonテストコードを書きました。インポートlxmlモジュールの原因PyImport_ImportModuleが失敗しました

fooを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(); 

エラーMSGがある:私は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で失敗します

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

'pModule == NULL'か、エラーが発生したかどうかを確認してください。助けがあれば私の最近の[回答](http://stackoverflow.com/questions/38745999/embedding-python-in-c-segmentation-fault/38791595#38791595)を参照してください。 –

+0

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.0をダウンロードします。それは私が言及した質問を引き起こした。

私はhttp://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml(lxml-3.6.1-cp27-cp27m-win32.whl)から新しいwhlインストーラをダウンロードし、古いものを更新します。大丈夫。

0

あなたのコードはpModule == NULL場合

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

でクラッシュします。あなたは質問がモジュールのファイル名がtest.pyであると述べているが、その後のコードでモジュール名がテストすなわちPyImport_ImportModule("Test")ある例

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

ため、戻り値をチェックする必要があります。大文字と小文字が一致している

はその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"はOKです。 lxml use msiパッケージをインストールします。おそらくあなたが言うように、lxmlのc拡張部分はインストールされていません。私はPythonには新しく、c拡張部分がどのようにインストールされているかを知りません。いくつか提案してもらえますか? – magicdmer

+0

cmdで直接Test.pyを実行してもうまく動作します。 – magicdmer

関連する問題