在Windows

时间:2017-02-09 09:56:45

标签: python c windows python-2.7 cpython

我现在已经编写了很多python,并决定我想更好地了解语言,我想使用CPython扩展python。

我找到了一些很酷的想法,现在想要实现它们。 我阅读了有关扩展cpython的文档,以及在这里的窗口: https://docs.python.org/2/extending/extending.html https://docs.python.org/2/extending/windows.html#building-on-windows

我使用CLion,使用cygwin 64bit从我的Windows计算机编程。 我首先决定要编译并从python的doc中导入示例,所以我的C模块看起来像这样:

#include <Python.h>
static PyObject *SpamError;

static PyObject *
spam_system(PyObject *self, PyObject *args)
{
    const char *command;
    int sts;

    if (!PyArg_ParseTuple(args, "s", &command))
        return NULL;
    sts = system(command);
    if (sts < 0) {
        PyErr_SetString(SpamError, "System command failed");
        return NULL;
    }
    return Py_BuildValue("i", sts);
}

static PyMethodDef SpamMethods[] = {
        {"system", spam_system, METH_VARARGS, "Execute a shell command."},
        {NULL, NULL, 0, NULL}
};

PyMODINIT_FUNC
initspam(void)
{
    PyObject *m;
    m = Py_InitModule("spam", SpamMethods);
    if (m==NULL)
        return;
    SpamError = PyErr_NewException("spam.error", NULL, NULL);
    Py_INCREF(SpamError);
    PyModule_AddObject(m, "error", SpamError);
}

int main(int argc, char* argv[]) {
    Py_SetProgramName(argv[0]);
    Py_Initialize();
    initspam();
}

我的cmake.txt是以下内容:

cmake_minimum_required(VERSION 3.6)
project(spam)

set(CMAKE_C_STANDARD 11)

set(SOURCE_FILES spammodule.c)
find_package(PythonLibs REQUIRED)
message(STATUS INCLUDE DIRS = ${PYTHON_INCLUDE_DIRS})
message(STATUS PYTHON_LIBRARIES = ${PYTHON_LIBRARIES})

include_directories(${PYTHON_INCLUDE_DIRS})

add_library(spam SHARED ${SOURCE_FILES})
target_link_libraries(spam ${PYTHON_LIBRARIES})

我设法合并代码并获取我的dll文件, 但是当我将文件后缀更改为pyd并导入时,我遇到以下异常:

ImportError: DLL load failed: The specified module could not be found.

虽然回溯只包含运行命令的框架:

import spam

这是可以理解的,因为这是我在python方面运行的唯一命令,其余的命令发生在C代码中。

我运行windows 10,64bit,(我的python和cygwin也是64位),并使用cygwin来模拟linux,所以我可以在我的CLion IDE上进行开发。

有人知道为什么会这样吗? (以及如何解决) 非常感谢!

P.S:

我尝试使用此setup.py:

使用distutils构建扩展

来自distutils.core导入设置,扩展

spam_module = Extension(name='spam', sources=['spammodule.c'], include_dirs=['D:/cygwin/usr/include/python2.7',
                                                                             'D:/cygwin/usr/include'],
                        libraries=['D:/cygwin/lib/libpython2.7.dll.a'])

setup(name='spam',
      version='1.0',
      description='Default Package',
      ext_modules=[spam_module])

但是我在运行时遇到异常:

python setup.py build
running build
running build_ext
building 'spam' extension
D:\Programs\Common\Microsoft\Visual C++ for Python\9.0\VC\Bin\amd64\cl.exe     /c /nologo /Ox /MD /W3 /GS- /DNDEBUG -ID:/cygwin/usr/include/python2.7 -     ID:/cygwin/usr/include -ID:\Python27\include -ID:\Python27\PC /Tcspammodule.c      /Fobuild\temp.win-amd64-2.7\Release\spammodule.obj
spammodule.c
D:/cygwin/usr/include\sys/_types.h(94) : error C2054: expected '(' to follow     '__extension__'
D:/cygwin/usr/include\sys/_types.h(94) : error C2085: '_off64_t' : not in     formal parameter list
D:/cygwin/usr/include\sys/_types.h(100) : error C2085: '__off_t' : not in     formal parameter list
D:/cygwin/usr/include\sys/_types.h(103) : error C2085: '_off64_t' : not in     formal parameter list
error: command 'D:\\Programs\\Common\\Microsoft\\Visual C++ for     Python\\9.0\\VC\\Bin\\amd64\\cl.exe' failed with exit status 2

我绝望,试图寻找解决方案几天,任何帮助将不胜感激!

0 个答案:

没有答案