2013-05-07 64 views
0

我用於在Linux下使用Cython編譯自制python擴展。在Linux上,我使用distutils生成一個「myext.so」,然後我可以簡單地將其添加到我的PYTHONPATH並獲得import myext python調用。使用cython擴展一旦編譯[在Windows下],如何使用.pyd的?

現在,我試圖讓它在Windows 7下工作(使用Cython 0.18)。 我成功地運行distutils,使我現在得到一個myext.pyd文件。但似乎(http://docs.python.org/2/faq/windows.html#is-a-pyd-file-the-same-as-a-dll)在windows下添加「myext.pyd」路徑是不夠的。 「myext.py」應該是什麼樣子,換句話說,在我的Python(2.7)安裝中獲得我的擴展的程序是什麼。

注:在已經加入含 「myext.pyd」 到PYTHONPATH目錄,我仍然得到:

python BdmLsim4.py -i model.xml 
Traceback (most recent call last): 
    File "BdmLsim4.py", line 6, in <module> 
    import myext 
ImportError: DLL load failed: module not found. 

非常感謝。

+0

sys.path在'ImportError'之前看起來像什麼? AFAIK將目錄放在'PYTHONPATH'中是你必須做的所有事情,所以也許你沒有正確地添加目錄。 – Bakuriu 2013-05-07 07:10:41

+0

Sys.path = [...,'D:\\ 02_DEV \\ EVOLAB \\ EVOLAB-2013-05-02 \\ ECLIPSE-WS_ELP \\ evolab-cython \\ src \\ Spatial','D:\ \ 02_DEV \ EVOLAB \\ EVOLAB-2013-05-02 \\ ECLIPSE-WS_ELP \\ evolab-cython \\ setup','C:\\ Windows \\ system32 \\ python27.zip','C:\\ Python27 \\ DLLs',...] 其中'D:\\ 02_DEV \\ EVOLAB \\ EVOLAB-2013-05-02 \\ ECLIPSE-WS_ELP \\ evolab-cython \\ setup'是我的位置.pyd。 我檢查了由Cython生成的包含所需「PyMODINIT_FUNC initmyext(void);/* proto * /」指令的「myext.cpp」。 所以路徑似乎沒問題。可能是我的.pyd文件編譯不好。你怎麼看 ? – 2013-05-07 07:28:22

+0

你在使用Eclipse嗎?您是否嘗試從命令提示符而不是Eclipse內運行程序? – Bakuriu 2013-05-07 07:31:38

回答

1

它寫清楚你鏈接的文檔中:

注意foo.pyd的搜索路徑是PYTHONPATH,不一樣 Windows使用的搜索foo.dll的路徑。此外,foo.pyd 不必存在來運行您的程序,而如果您將 程序與dll鏈接,則需要dll。當然,如果你想說import foo,foo.pyd是 。在DLL中,使用__declspec(dllexport)在源代碼中聲明鏈接爲 。在.pyd中,鏈接是在可用函數列表中定義的 。

所以,你要麼把你的.pyd文件Python的安裝目錄(site-packages)裏面,或者你可以修改環境變量PYTHONPATH並添加其中.pyd放置的目錄。

還有一種替代方法是使用.pth文件來擴展PYTHONPATH