pyximport очень удобен, но я не могу понять, как заставить его использовать параметры языка С++ для Cython. Из командной строки вы запустите cython --cplus foo.pyx
. Как вы достигаете эквивалента с pyximport? Спасибо!
Как вы говорите pyximport использовать параметр cython --cplus?
Ответы (4)
Один из способов заставить Cython создавать файлы C++ — использовать файл pyxbld. Например, создайте foo.pyxbld
, содержащий следующее:
def make_ext(modname, pyxfilename):
from distutils.extension import Extension
return Extension(name=modname,
sources=[pyxfilename],
language='c++')
Вот хак.
Следующий код исправляет функцию 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()
.
Более легким/менее навязчивым решением было бы использовать 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
, но точное значение, вероятно, лучше всего видно из самого кода (здесь хорошая отправная точка).
Вы можете заставить 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.