2011-05-29 88 views
7

我有一個Python腳本,我將腳本重命名爲.pyx文件。我想將此代碼編譯爲一個stand dll文件。如何使用Cython創建站點dll

我在this document看到Cython會創建一個dll文件,但我只得到一個pyd。

我有MinGW和嘗試使用命令python setup.py build --compiler=mingw32編譯腳本我的代碼(只是一個Hello World):

def init(): 
    return "hello world" 

任何想法?謝謝

+2

這不是用Cython是。它是用Python方言編寫CPython擴展的,它可以並且應該用於編寫必須與Python密切協作的低級靜態類型代碼。不用於將python代碼轉換爲可以從不相關代碼中調用的內容(例如不知道CPython的C程序)。 – delnan 2011-05-29 21:04:55

回答

3

所以首先要做的是將 文件重命名爲helloworld.pyx。現在我們需要 make setup.py,這就像是一個 python Makefile(更多信息 參見編譯)。你setup.py應該 樣子:

from distutils.core import setup 
from distutils.extension import Extension 

from Cython.Distutils import build_ext 
    setup(
     cmdclass = {'build_ext': build_ext}, 
     ext_modules = [Extension("helloworld", 
    ["helloworld.pyx"])]) 

以此來建立你用Cython文件 使用命令行選項:

$ python setup.py build_ext --inplace 

這將留在你的本地 目錄名爲HelloWorld的一個文件。所以在unix 或helloworld.dll在Windows中。

我們 使用本文件:啓動蟒蛇 解釋,並導入它彷彿 這是一個普通的Python模塊:

+0

謝謝。我做的和你一樣,在xp sp3中,但我不能得到一個helloworld.dll,但有一個helloword.pyd和一個生成文件夾。這是我想知道爲什麼沒有DLL填充 – ljx0517 2011-05-30 01:14:46

+0

[pyd = dll與Python函數](http://stackoverflow.com/a/11797037/819417) – 2014-05-02 08:47:57

3

Is a *.pyd file the same as a DLL?

是,.pyd文件是DLL的,但有一些差異。如果您的 有一個名爲foo.pyd的DLL,那麼它必須具有函數PyInit_foo()。 然後,您可以編寫Python「import foo」,Python將搜索 foo.pyd(以及foo.py,foo.pyc),如果發現它,將嘗試 以調用PyInit_foo()來初始化它。您不要將您的.exe與 foo.lib鏈接,因爲這會導致Windows要求DLL存在。

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

Modifying Python’s Search PathAbsolute and Relative Imports