2016-07-02 115 views
1

我需要爲性能和CUDA利用率創建一個新的python模塊作爲c擴展。我已經嘗試了幾個教程,並沒有成功。下面是我的文件:構建Python C擴展

hellomodule.c

#include <Python.h> 

static PyObject* say_hello(PyObject* self, PyObject* args) 
{ 
    const char* name; 

    if (!PyArg_ParseTuple(args, "s", &name)) 
     return NULL; 

    printf("Hello %s!\n", name); 

    Py_RETURN_NONE; 
} 

static PyMethodDef HelloMethods[] = 
{ 
    {"say_hello", say_hello, METH_VARARGS, "Greet somebody."}, 
    {NULL, NULL, 0, NULL} 
}; 

PyMODINIT_FUNC inithello(void) 
{ 
    (void) Py_InitModule("hello", HelloMethods); 
} 

setuphello.py

from distutils.core import setup, Extension 

module1 = Extension('hello', sources = ['hellomodule.c']) 

setup (name = 'PackageName', 
    version = '1.0', 
     description = 'This is a demo package', 
     ext_modules = [module1]) 

這裏是我的結果爲python setuphello.py build

running build 
running build_ext 
building 'hello' extension 
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\cl.exe /c /nologo /Ox /W3 /GL /DNDEBUG /MD -IC:\Anaconda3\include -IC:\Anaconda3\include "-IC:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\NETFXSDK\4.6.1\include\um" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\shared" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\um" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\winrt" "-IC:\Program Files (x86)\IntelSWTools\Trace Analyzer and Collector\9.1.2.024\include" /Tchellomodule.c /Fobuild\temp.win32-3.5\Release\hellomodule.obj 
hellomodule.c 
hellomodule.c(23): warning C4013: 'Py_InitModule' undefined; assuming extern returning int 
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\link.exe /nologo /INCREMENTAL:NO /LTCG /DLL /MANIFEST:EMBED,ID=2 /MANIFESTUAC:NO /LIBPATH:C:\Anaconda3\libs /LIBPATH:C:\Anaconda3\PCbuild\win32 "/LIBPATH:C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\LIB" "/LIBPATH:C:\Program Files (x86)\Windows Kits\10\lib\10.0.10240.0\ucrt\x86" "/LIBPATH:C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6.1\lib\um\x86" "/LIBPATH:C:\Program Files (x86)\Windows Kits\10\lib\10.0.10240.0\um\x86" /EXPORT:PyInit_hello build\temp.win32-3.5\Release\hellomodule.obj /OUT:build\lib.win32-3.5\hello.cp35-win32.pyd /IMPLIB:build\temp.win32-3.5\Release\hello.cp35-win32.lib 
LINK : error LNK2001: unresolved external symbol PyInit_hello 
build\temp.win32-3.5\Release\hello.cp35-win32.lib : fatal error LNK1120: 1 unresolved externals 
error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\BIN\\link.exe' failed with exit status 1120 

我已經看過別人有過的各種錯誤,並嘗試遵循他們的調試邏輯,但對於導致我的錯誤的幕後幕後發生的事情,我誠懇地不知所措。我正在使用Python 3.5 32位(Anaconda),因此一直在嘗試使用Visual C++構建工具及其打包終端進行編譯。但這並沒有什麼區別。有人能帶我走向正確的方向嗎?

回答

1

您的方法存在的問題是您在使用Python 3.5.x解釋器時依賴於Python 2.7.x的教程/指南(也許是this?)。

構建C擴展的方法在Python 3.x中有changed

所以,爲了使你的「你好」模塊編譯你將不得不做出相應的改變hellomodule.c

首先,添加以下struct正上方的inithello()功能:

static struct PyModuleDef hellomodule = { 
    PyModuleDef_HEAD_INIT, 
    "hello", /* module name */ 
    NULL, /* module documentation, may be NULL */ 
    -1, 
    HelloMethods /* the methods array */ 
}; 

然後用這個代替更換整個inithello()功能:

PyMODINIT_FUNC PyInit_hello(void) 
{ 
    return PyModule_Create(&hellomodule); 
} 

你不必做的setuphello.py腳本,您可以照常運行的任何變化:

python setuphello.py build


您可以快速測試新編譯的模塊通過進入build \ lib.win32-3.5目錄(或類似的東西),複製.pyd file (在我的系統中,它被命名爲hello.cp35-win32.pyd)某個地方很方便,並且使用類似這樣的小腳本(usehello。PY):

import hello 

def greet(person): 
    hello.say_hello(person) 

greet("stranger") 

運行率:

c:\>python usehello.py 
Hello stranger! 

c:\> 

對於擴展過程的完整描述,您可以go爲Python的3.5

+1

官方文檔這個工作謝謝!我所要做的只是查看3.5文檔來解決這個問題,所以這是我的錯誤。非常感謝幫助我! – Dan