【问题标题】:How to create a .pyd file?如何创建 .pyd 文件?
【发布时间】:2016-04-28 17:46:56
【问题描述】:

我正在创建一个使用 Python OpenCV 的项目。我的图像处理有点慢,所以我想我可以通过创建一个.pyd 文件来加快代码速度(我在某处读到过)。

我可以使用 Cython 创建一个.c 文件,但是如何创建一个.pyd?虽然它们是一种.dll,但我应该先创建一个.dll 并转换它吗?而且我认为它们不是独立于平台的,在 Unix 上有什么等价物?

感谢您的帮助!

【问题讨论】:

    标签: python performance opencv compilation cython


    【解决方案1】:

    您必须在终端中运行setup.py 文件。这是一个使用numpy的例子

    try:
        from setuptools import setup
        from setuptools import Extension
    except ImportError:
        from distutils.core import setup
        from distutils.extension import Extension
    
    from Cython.Distutils import build_ext
    import numpy as np
    
    ext_modules = [Extension("my_code_cython",["my_code_cython.pyx"]),
                   Extension("another_code_cython",["another_code_cython.pyx"])]
    
    setup(
        name= 'Generic model class',
        cmdclass = {'build_ext': build_ext},
        include_dirs = [np.get_include()],
        ext_modules = ext_modules)
    

    在终端(Windows 中的 cmd)中,您必须执行命令

    python setup.py build_ext --inplace
    

    重要的是我假设您已经安装了编译器(例如 Microsoft Visual C++ Compiler Package for Python 2.7)。您可以在https://github.com/cython/cython/wiki/CythonExtensionsOnWindows找到更多信息

    【讨论】:

    • 谢谢你,我已经想通了:)。我可以在 *nix 上使用它来使用 gcc 创建 .so 文件吗?
    • 是的,这就是我在 Windows 和 *nix(在我的情况下是 Ubuntu)上使用的代码
    • 这个问题,至少对我来说,是我不知道如何使用setuptools(或distutils)指定不同的编译器。例如,Windows 中的英特尔编译器。
    【解决方案2】:

    先决条件
    Cython
    MinGW-w64 已添加到您的 PATH 环境变量中

    您需要在 .py 文件中添加一个名为 inityourfilename 的函数 然后必须通过

    制作一个.c文件
    cython --embed yourfile.py
    

    然后您需要使用 gcc 将其编译为 .o 文件,将 -I 之后的文本替换为您的 Python 包含文件夹的路径

    如果你的 MinGW 是 64 位,那么这个命令

    gcc -mdll -O -Wall -IC:\\Users\\yourusername\\AppData\\Local\\Programs\\Python\\Python39\\include -c -DMS_WIN64 yourfile.c
    

    如果您的 MinGW 是 32 位,请删除 -DMS_WIN64 标志

    从 .o 文件制作 .pyd 文件

    gcc -shared -LC:\\Users\\yourusername\\AppData\\Local\\Programs\\Python\\Python39\\libs yourfile.o -lpython39 -o yourfile.pyd   
    

    将 -L 后的文本替换为您的 libs 文件夹的路径
    如果您有 python 3.8,请将 -lpython39 替换为您的 python 版本,即 -lpython38

    现在通过将 .pyd 文件导入另一个文件来检查它

    【讨论】:

      【解决方案3】:

      将 cythonize 与各自的依赖项一起使用:

      from setuptools.extension import Extension
      extensions.append(Extension("write the file names.pyx"))
      from Cython.Build import cythonize
      ext_modules = cythonize(extensions)
      

      那么,

      setup(ext_modules=ext_modules, **setup_kwargs)
      

      【讨论】:

        【解决方案4】:

        如果您尝试使用 cython 和 Visual Studio 将 python 代码转换为 pyd( Python Dynamic Module ) 来找到答案,那么您将得到一个模糊的答案。由于与更高版本的兼容性问题,您希望工作的可视化代码可能无法正常工作。比如msvc的1900、1929。

        您需要在 disutils 中编辑 cygwin-compiler 才能完成工作。如果你想使用 MingW,那么你还需要包含 disutils 中使用的编译器的配置。

        一个非常简单的方法是我们可以使用Nuitka,将python代码转换为C和Python动态库非常简单可靠。无需配置,无需添加支持。

        让我们掌握基本知识

        1)。安装nuitka,点安装nuitka

        2)。从 Sourceforge 安装 MingW

        3)。将mingW添加到路径

        现在一切都很好。 4).以管理员身份打开cmd,输入python -m nuitka --module file.py

        Nuitka 将在当前目录中创建 file.c、file.pyi(用于导入)和 file.cp39_architecture.pyd。从 file.pyd 你可以直接将模块导入到你的 main.py 中,它会很快。

        但是,如果您想创建独立应用程序然后尝试, python -m nuitkafile.py

        【讨论】:

          猜你喜欢
          • 2019-01-26
          • 1970-01-01
          • 2021-07-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多