2011-02-18 48 views
8

我正在嘗試爲供應商C++庫編寫一個綁定。我已經成功地使用了下面的代碼片段來定義其他模塊中的init函數,但是在這個代碼中它似乎不起作用:它編譯得很好,但是一旦我嘗試將它導入到測試中時就會拋出ImportError腳本。這裏有什麼可能是錯的?ImportError:動態模塊沒有定義初始化函數,但它的確如此

#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */ 
#define PyMODINIT_FUNC void 
#endif 
PyMODINIT_FUNC initclient(void) { 

    PyObject* m; 

    ClientType.tp_new = PyType_GenericNew; 
    if (PyType_Ready(&ClientType) < 0) 
     return; 

    m = Py_InitModule3("client", client_methods, "Client module"); 
    Py_INCREF(&ClientType); 
    PyModule_AddObject(m, "Client", (PyObject *) &ClientType); 

} 

這是在32位Linux上,使用gcc 4.4.4。

+3

哪個平臺,編譯器,...? – 2011-02-18 13:40:38

回答

-3

這變成與Python或編譯器無關,但是是不正確的編譯器咒語(編輯Makefile時必須多加註意)。

+24

如果您可以將您的解決方案包含給其他具有相同問題的人,那將是非常好的! – nont 2011-09-19 01:57:05

+1

@djc你的任何額外信息是解決方案?目前我遇到這個問題 – Awalias 2013-08-12 13:47:15

7

我有同樣的問題。在編譯時:

  • 路徑Python的頭:OK
  • 路徑Python庫:OK對Python庫
  • 鏈接:確定針對需要第三方的庫/目標文件
  • 鏈接: OK

我只是忘了編譯定義我的模塊...唉C文件...

所以是的,第一件事情檢查:您的makefile或編譯命令! :)

5

我有相同的錯誤消息,但它是因爲我重命名我的.c文件,並忘記更新代碼內的名稱。 「initxxx」函數和它內部的一個參數。

0

在linux上它可以幫助在這種情況下運行strace。檢查Python庫搜索的名稱是否與您構建的庫的名稱相同。

0

的痛飲文檔中提到here

This error is almost always caused when a bad name is given to the shared object file. For example, if you created a file example.so instead of _example.so you would get this error.

1

確保您包括您_wrap.cxx。在我看來,它不會被編譯到你的模塊中。

5

確保您不要混用Python版本。在Python版本2中,init函數被稱爲Init_,而在版本3中,這個函數被稱爲PyInit_

在我的情況下,當SWIG 3.0.2使用Python 3.4生成綁定時發生這種情況,而我的Python IDE稱爲Python 2.7翻譯。

你可以看到在生成的文件.CXX的區別:

#if PY_VERSION_HEX >= 0x03000000 
# define SWIG_init PyInit__<modulename> 

#else 
# define SWIG_init init_<modulename> 

#endif 

在Linux上你也可以使用下面的命令來檢查你的。所以出口:

nm -D <modulename> | grep <modulename> 

這會給你庫中的init函數的名稱。

0

在接口文件中,SWIG建議使用:

#define SWIG_FILE_WITH_INIT 
相關問題