我现在已经编写了很多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
我绝望,试图寻找解决方案几天,任何帮助将不胜感激!