首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何创建使用C扩展的Python库?

如何创建使用C扩展的Python库?
EN

Stack Overflow用户
提问于 2019-07-27 14:09:23
回答 1查看 175关注 0票数 1

我的目标是创建一个Python库,我可以将其导入到我的任何项目中,我希望通过使用C语言(类似于NumPy的工作方式)使库更快。

但是,在遵循了许多不同的教程和视频之后,我总是会遇到相同的错误,并且无法完成教程中说我应该能够完成的过程。我一直在学习TutorialsPoint:extensions的这个教程

我试过搜索错误,尽管没有任何有价值的结果。

我正在我的PC上运行Windows 10 64位,安装了32位和64位的Python版本(我相信问题可能与不正确的Python版本有关)。我完全按照教程的要求做了,但是,在安装(构建?)时,我总是会导致相同的错误结果。它。

下面是我的C代码(名为hello.c),它是从教程中复制和粘贴的:

代码语言:javascript
复制
#include <Python.h>

static PyObject* helloworld(PyObject* self) {
   return Py_BuildValue("s", "Hello, Python extensions!!");
}

static char helloworld_docs[] =
   "helloworld( ): Any message you want to put here!!\n";

static PyMethodDef helloworld_funcs[] = {
   {"helloworld", (PyCFunction)helloworld,
      METH_NOARGS, helloworld_docs},
      {NULL}
};

void inithelloworld(void) {
   Py_InitModule3("helloworld", helloworld_funcs,
                  "Extension module example!");
}

下面是我的python setup.py代码,它也是从教程中复制和粘贴的,尽管我已经将目录输入到hello.c文件中:

代码语言:javascript
复制
from distutils.core import setup, Extension
setup(name='helloworld', version='1.0', ext_modules=[Extension('helloworld', ['C:/Users/penci/OneDrive/Python3.7_64bit/Lib/site-packages/PythonLib/CCode/hello.c'])])

一旦我这样做,并保存了他们所有(在同一个文件),本教程说,运行setup.py脚本后,“安装”。在本教程中,它说它应该创建所需的the和数据,并且应该能够将python包导入到我的代码中。然而,当我运行它时,我得到了两件事中的一件,这取决于我如何运行它。

  1. 我打开命令提示符,运行安装后的setup.py,就像教程中显示的那样。这个运行程序的方法将给我一个错误代码1120,或者它会打印出以下内容: 运行安装运行构建运行build_ext运行install_lib复制install_lib ->运行install_egg_info写入C:\Users\penci\OneDrive\Python3.7_64bit\Lib\site-packages\helloworld-1.0-py3.7.egg-info 但是,当我试图将脚本导入我的python代码时,它会出现在代码建议窗口中,但是它说“没有一个模块名为helloworld”(使用PyCharm社区)。
  2. 我以管理员身份打开命令提示符,并执行完全相同的操作。当我这样做时,它总是给我同样的结果: 运行安装运行构建运行的build_ext构建'helloworld‘扩展名C:\Program (x86)\Microsoft Visual /c /nologo /Ox /W3 /GL /DNDEBUG /MT /DNDEBUG/MT "-IC:\Program文件(X86)\\2019\Community\VC\工具\MSVC\14.22.27905\ATLMFC\包括"-IC:\Program Files (x86)\Microsoft Visual x86 "-IC:\Program Files (x86)\Windows Kits\NETFXSDK\4.7.2\include\um“-IC:\Program Files (X86)\-IC:\Program Kits\10 \re10.0.18362.0\ucrt "-IC:\Program Files (x86)\Windows \10\包含\10.0.18362.0\共享"-IC:\Program文件(x86)\Windows工具包\10\包括\10.0.18362.0\um“"-IC:\Program文件(x86)\Windows工具包\10\包括\10.0.18362.0\winrt”"-IC:\Program文件(x86)\Windows工具包\10\包含\10.0.18362.0\cppwinrt“-IC:\Program文件(X86)\-IC:\Program工具包\10\包括\10.0.18362.0\cppwinrt”-IC:\Program文件“-packages/PythonLib/CCode/hello.c /Fobuild\temp.win-amd64-3.7\Release\Users/penci/OneDrive/Python3.7_64bit/Lib/site-packages/PythonLib/CCode/hello.obj hello.c C:/Users/penci/OneDrive/Python3.7_64bit/Lib/site-packages/PythonLib/CCode/hello.c(17):警告C4013:“Py_InitModule3”未定义;假设extern返回int C:\Users\penci\OneDrive\Python3.7_64bit\Lib\site-packages\PythonLib\CCode\hello.c :致命错误C1083:无法打开编译器生成的文件:'C:\Windows\system32\build\temp.win-amd64-3.7\Release\Users\penci\OneDrive\Python3.7_64bit\Lib\site-packages\PythonLib\CCode\hello.obj':没有这样的文件或目录错误:命令'C:\Program (X86)\\2019\Community\VC退出状态1的\Tools\MSVC\14.22.27905\bin\HostX86\x64\cl.exe‘失败

(不好意思,代码太多了,我只是不确定哪一位才能帮助解决这个问题)

我已经尝试谷歌“退出状态1”,但没有出现有意义的结果。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-27 16:10:48

在你的1第一点,我没有足够的信息给你任何帮助。事实上,即使看到错误,1120也会间断性地显示与errlook.exe无关的消息。

在您的2和要点中,问题似乎是编译器没有找到Py_InitModule3函数的定义。这就得出结论,您没有链接定义该符号的正确python库。

实现正确链接而无需修改代码或setup.py脚本的一种简单方法是定义环境变量LIBcl.exe调用的microsoft链接器将查看该变量以定位python37.lib库。

代码语言:javascript
复制
SET LIB=%LIB%;C:/Users/penci/OneDrive/Python3.7_64bit/libs

然后,您必须在设置变量的控制台中运行setup.py脚本。这将解决链接问题,如果没有其他问题出现,这应该允许使用您的自定义模块。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57232897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档