【问题标题】:How do you tell pyximport to use the cython --cplus option?你如何告诉 pyximport 使用 cython --cplus 选项?
【发布时间】:2011-11-29 00:27:03
【问题描述】:

pyximport 非常方便,但我不知道如何让它使用 Cython 的 C++ 语言选项。从命令行运行cython --cplus foo.pyx。您如何使用 pyximport 实现等效功能?谢谢!

【问题讨论】:

  • 我现在似乎没有更简单的方法。如果将这样的内容添加到 pyximport 中,那就太好了。我刚刚尝试了docs.cython.org/src/userguide/… 中显示的注释编译器指令,它们似乎不适用于 pyximport。

标签: c++ python cython


【解决方案1】:

让 Cython 创建 C++ 文件的一种方法是使用 pyxbld 文件。例如,创建包含以下内容的 foo.pyxbld

def make_ext(modname, pyxfilename):
    from distutils.extension import Extension
    return Extension(name=modname,
                     sources=[pyxfilename],
                     language='c++')

【讨论】:

  • 为了清楚起见,pyximport 会自动遵守 foo.pyxbld 中给出的指令吗?
  • 我对最后一点也很好奇。如何/在哪里考虑 pyxbld 文件?
【解决方案2】:

这是一个技巧。

以下代码猴子修补pyximport 中的get_distutils_extension 函数,以便它创建的Extension 对象都将其language 属性设置为c++

import pyximport
from pyximport import install

old_get_distutils_extension = pyximport.pyximport.get_distutils_extension

def new_get_distutils_extension(modname, pyxfilename, language_level=None):
    extension_mod, setup_args = old_get_distutils_extension(modname, pyxfilename, language_level)
    extension_mod.language='c++'
    return extension_mod,setup_args

pyximport.pyximport.get_distutils_extension = new_get_distutils_extension

把上面的代码放在pyximportcpp.py中。然后,不要使用import pyximport; pyximport.install(),而是使用import pyximportcpp; pyximportcpp.install()

【讨论】:

    【解决方案3】:

    一个更轻量级/更少侵入性的解决方案是使用setup_args/script_argspyximport 将传递给distutils,在后台使用:

    script_args = ["--cython-cplus"]
    setup_args = {
        "script_args": script_args,
    }
    pyximport.install(setup_args=setup_args, language_level=3)
    

    python setup.py build_ext 的其他选项可以以类似的方式传递,例如script_args = ["--cython-cplus", "--force"].

    文档的corresponding part 提到了setup_args 的用法,但确切的含义可能从代码本身最清楚(here 是一个很好的起点)。

    【讨论】:

      【解决方案4】:

      您可以让 pyximport 使用 cythonize 命令进行扩展,从而让 pyximport 识别标题注释 # distutils : language = c++。为此,您可以在 filename.pyx 旁边创建一个新文件 filename.pyxbld

      # filename.pyxbld
      
      from Cython.Build import cythonize
      
      def make_ext(modname, pyxfilename):
          return cythonize(pyxfilename, language_level = 3, annotate = True)[0]
      

      现在您可以使用 distutils 标头 cmets:

      # filename.pyx
      
      # distutils : language = c++
      

      Pyximport 将使用 .pyxbld 文件中的 make_ext 函数来构建扩展。并且 cythonize 将识别 distutils 标头 cmets。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-11-20
        • 2013-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-13
        相关资源
        最近更新 更多