2009-12-30 111 views
3

我爲我的Python創建了擴展,並創建了一個abcPython.dll。我怎樣才能將這個DLL導入到我的Python腳本中?Python dll擴展導入

我得到一個錯誤信息,當我試圖將其導入頁使用下面的命令

>>>import abcPython 
>>>Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    ImportError: No module named abcPython 
>>> 

我手動創建了一個名爲PYTHONPATH存儲的路徑abcPython.dll系統環境變量,但仍是錯誤仍然存​​在。

我該如何解決這個問題?

+0

你好,你好......你是否解決了你的問題?你打算接受答案嗎? – 2010-01-11 22:45:26

回答

12

關注Building C and C++ Extensions on Windows小心 - 在次節7,它說:

The output file should be called spam.pyd (in Release mode) or spam_d.pyd (in Debug mode). The extension .pyd was chosen to avoid confusion with a system library spam.dll to which your module could be a Python interface
...
Changed in version 2.5: Previously, file names like spam.dll (in release mode) or spam_d.dll (in debug mode) were also recognized.

嘗試重新命名DLL使用.pyd延伸,而不是.dll

(感謝,Peter Hansen

參考點到C example,其中明確包括INIT功能, PyMODINIT_FUNC initexample(void)。產生的DLL應該重命名爲example.pyd

#include "Python.h" 

static PyObject * 
ex_foo(PyObject *self, PyObject *args) 
{ 
    printf("Hello, world\n"); 
    Py_INCREF(Py_None); 
    return Py_None; 
} 

static PyMethodDef example_methods[] = { 
    {"foo", ex_foo, METH_VARARGS, "foo() doc string"}, 
    {NULL, NULL} 
}; 

PyMODINIT_FUNC 
initexample(void) 
{ 
    Py_InitModule("example", example_methods); 
} 
+0

感謝回答 我改名的.dll文件到.pyd,然後嘗試了以下 >>>進口abcPython 回溯(最近通話最後一個): 文件「」,1號線,在 導入錯誤:動態模塊沒有定義初始化函數(PyInit_abcPython) >>> – user240840 2010-01-07 12:40:55

+1

按照鏈接引用中的指令並定義初始化函數! – gimel 2010-01-07 13:24:38

+0

有人問OP他使用什麼版本的Python? – 2010-01-08 13:48:34

2

Aarrgghh!又一個2.X/3.X陷入困境。 RTFErrorMessage:

ImportError: dynamic module does not define init function (PyInit_abcPython)

注意前綴:這不是INIT,這是PyInit_

3.1 docs ......「初始化函數必須命名爲PyInit_name(),其中name是模塊名稱「

1

簡單地將.dll重命名爲.pyd並沒有幫助。我正在使用SWIG創建擴展模塊。我創建了一個.pyd而不是創建一個.dll模塊,並解決了這個問題。

0

舉個例子:假設你已經編譯了OpenCV並且有幾個* .dll和cv2.pyd文件。

您需要將這些文件複製到python目錄下的'DLLs'文件夾中。

然後導入模塊檢查是否正常。