首页 > 解决方案 > C:创建/使用头文件和 Cython、Cythonize setup.py、MSVC 和 GCC 问题需要明确吗?

问题描述

C:Cython、Cythonize、setup.py/MSVC、GCC 问题和创建/使用头文件需要清晰

大家好,

我对 Cython 比较陌生,对 C 语言也很陌生,但对 Python、Visual Basic 和 Java 有一些编程经验。

对于我当前的项目,我的机器在 Windows Pro 10 1909 x64、Python 3.7.9 x64 和 Cython 0.29.21 上运行,我的最终目标是创建一个包含所有模块的 EXE 文件。

我目前还没有包含任何cdef声明或类似的声明,我计划逐步添加这些声明。本质上,我目前正在做的是在概念验证阶段,以表明我可以毫无问题地编译和运行当前和未来的代码。

我有一个__main__模块存储在根项目文件夹中,我的其他(一些非常大的)Python模块重命名为.pyx处理不同类型文件(、、、、等)的文件.csv,每个.json文件都有自己的特征和提取方法,存储在一个' ' 文件夹。.html.xmlincludes

据我了解,头文件包含函数定义,然后根据需要调用这些函数定义,以充当子例程和主模块之间的桥梁。我目前还没有创建任何头文件,因为我需要明确几点。

我也无法通过setup.py( setuptools) 通过MSVC和进行 Cythonizing GCC

下面是迄今为止概述的步骤的讨论,以达到关于 setup.py 的这一点,GCC并直接从提示运行,最后是我的主要问题。


步骤1

setup.py我第一次尝试编译代码是从提升的命令提示符准备文件。

from setuptools import Extension, setup
from Cython.Build import cythonize

extensions = [
    Extension("main", ["__main__.pyx"],
    include_paths=r"C:\path\to\parsing_company_accounts_master_cython\includes"),
]
setup(
    name="iXBRLConnect",
    ext_modules=cythonize(extensions, compiler_directives={'language_level' : "3"}),
)

但是,在 Python 3.7.9 x64 中,我得到以下输出。

python setup.py bdist
running bdist
running bdist_dumb
running build
running build_ext
building 'main' extension
error: Microsoft Visual C++ 14.0 or greater is required. Get it with "Microsoft C++ Build Tools": https://visualstudio.microsoft.com/visual-cpp-build-tools/

x64 Native Tools Command Prompt从 2015 年开始,在提升的(任何版本的 VS 或独立构建工具)中运行时,我在所有版本的 Python 和安装构建工具的许多变体时都有同样的错误。

在此站点上搜索指向需要添加的许多不同的 SDK、库等,但是在遵循了许多答案和多次重新启动之后,我仍然无法setup.py运行。

我可以使用 VS 社区版作为 GUI 进行编译,但是在使用命令行时所有的努力似乎都被混淆了(没有其他原因,只是为了保持精简安装)。目前尚不清楚为什么提示路线不起作用。


第2步

为了不甘示弱,我尝试安装GCC - MinGW-w64( https://wiki.python.org/moin/WindowsCompilers ),这是一个支持 Python 3.4 的替代编译器。

注意到 Python 3.4 已经过时,我卸载 Python 3.7.9 x64,安装 3.4 并重新安装我的pip站点包。

但是,安装BeautifulSoup4给了我这个消息:

RuntimeError: Python 3.5 or later is required

我会用大量的盐来处理 Python 3.4 的 EOL 问题,但BS4它是我项目的一个关键库,所以这几乎是一个展示者。


第 3 步

最后,我尝试直接在命令行上构建文件。

首先,我将其他.pyx模块移动到"c:\path_with_spaces\to\includes"(总共 9 个)中,将__main__.pyx 保留在主项目文件夹中,然后从项目文件夹中运行下一个命令。

cython -3 --annotate --embed=main __main__.pyx --include-dir "c:\path_with_spaces\to\includes"

问题

所以,以上所说和所做的一切(呸!),以下是我需要澄清的几点: -

Q1:在我看来,' include_paths'/' include-dir' 参数指定其他附加目录只是为了创建新的 C 文件 - 我推测这是因为现有*.pyx模块旁边没有头文件?[最初,我天真地以为 Cython 会自动提升标题和.c文件?相反,根本没有-.c.h-为它们生成任何东西。] 我的“--include_dirs”命令行语法有什么问题,因为.c无论如何都应该提出文件,而我只是“插入”头文件?这么说是没有错的。或者,正如您对库文件所期望的那样,包含的文件是否只是为了被读取而没有对其采取其他操作?

Q2:随着我不断了解越来越清楚,头文件需要提前准备好,根据这个:https ://cython.readthedocs.io/en/latest/src/userguide/external_C_code.html和这个:http ://hplgit.github.io/primer.html/doc/pub/cython/cython-readable.html但是据我从他们的例子中可以确定(除非我看错了),他们只打电话他们的模块在某个时候来自主模块。取最后一个链接,我dice6_cwrap对示例中的''不太清楚dice6_cwrap.pyx(我认为应该在主模块中引用它,但在本示例中没有直接显示)。另外,我是否还需要其他文件,也许是某种清单?

Q3:部分回答 Q2,我想我可以将模块“链接”在一起,如下所述:C++ 中包含的链如何起作用?? 这对我来说很重要,因为我的代码到目前为止的工作方式是加载每个模块(取决于找到的文件),然后以“链”序列运行模块以首先解析汤对象中的所有元素,遍历每个行元素,最后提取每个属性并将它们插入到一个公共数据库中。在实际实践中,这可能意味着从子模块中的 'start' 方法开始计算并取决于所讨论的属性,总共最多有 8 个“链接”。仅供参考,其中一些模块还包括 pandas、numpy 和多处理模块。大声思考 - 包括头文件,这意味着准备 16 个文件?哇!(但是,有一点运气和手指交叉 - C 编译与 Python 解释的速度提升......其他瓶颈允许)。

为我的华夫饼道歉,我欢迎你对我如何继续前进的想法。

提前致谢。

标签: cpython-3.xcythonheader-filescythonize

解决方案


推荐阅读