Как вы говорите pyximport использовать параметр cython --cplus?

pyximport очень удобен, но я не могу понять, как заставить его использовать параметры языка С++ для Cython. Из командной строки вы запустите cython --cplus foo.pyx. Как вы достигаете эквивалента с pyximport? Спасибо!


person BrianTheLion    schedule 01.10.2011    source источник
comment
Не похоже, что сейчас есть более простой способ. Было бы неплохо, если бы что-то подобное добавили в pyximport. Я только что попробовал закомментированные директивы компилятора, показанные в docs.cython.org/src/userguide/ и, похоже, они не работают с pyximport.   -  person IanH    schedule 21.02.2014


Ответы (4)


Один из способов заставить Cython создавать файлы C++ — использовать файл pyxbld. Например, создайте foo.pyxbld, содержащий следующее:

def make_ext(modname, pyxfilename):
    from distutils.extension import Extension
    return Extension(name=modname,
                     sources=[pyxfilename],
                     language='c++')
person Eryk Sun    schedule 01.10.2011
comment
Просто для ясности, будет ли pyximport автоматически соблюдать директивы, указанные в foo.pyxbld? - person BrianTheLion; 01.10.2011
comment
Меня тоже интересует последний пункт. Как/где учитываются файлы pyxbld? - person rodrigob; 17.07.2014

Вот хак.

Следующий код исправляет функцию get_distutils_extension в pyximport таким образом, что все создаваемые ею объекты 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().

person user4967717    schedule 03.06.2015

Более легким/менее навязчивым решением было бы использовать setup_args/script_args, который pyximport передал бы 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"].

В соответствующей части документации упоминается использование setup_args, но точное значение, вероятно, лучше всего видно из самого кода (здесь хорошая отправная точка).

person ead    schedule 23.04.2021

Вы можете заставить pyximport распознавать комментарий заголовка # distutils : langauge = c++, если pyximport сделает расширения с помощью команды cythonize. Для этого вы можете создать новый файл filename.pyxbld рядом с вашим filename.pyx:

# filename.pyxbld

from Cython.Build import cythonize

def make_ext(modname, pyxfilename):
    return cythonize(pyxfilename, language_level = 3, annotate = True)[0]

и теперь вы можете использовать комментарии заголовка distutils:

# filename.pyx

# distutils : langauge = c++

Pyximport будет использовать функцию make_ext из вашего файла .pyxbld для создания расширения. И cythonize распознает комментарии заголовка distutils.

person Golden Rockefeller    schedule 22.04.2021