Во-первых, чтобы ответить на ваш актуальный вопрос:
Я хочу, есть ли способ настроить Cython для компиляции с указанным режимом UCS.
Вы можете создать отдельную установку Python из исходного кода и связать Cython против его заголовков. Чтобы найти заголовки, вы можете использовать инструмент python-config
(или python3-config
для Python 3). Обычно он находится в каталоге bin
, где находится исполняемый файл python
:
$ # system python on my machine (macos):
$ which python-config
/usr/bin/python-config
$ # python 3 installation
$ which python3-config
/Library/Frameworks/Python.framework/Versions/3.6/bin/python3-config
$ python-config --cflags
-I/System/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7 -I/System/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7 -fno-strict-aliasing -fno-common -dynamic -arch x86_64 -arch i386 -g -Os -pipe -fno-common -fno-strict-aliasing -fwrapv -DENABLE_DTRACE -DMACOSX -DNDEBUG -Wall -Wstrict-prototypes -Wshorten-64-to-32 -DNDEBUG -g -fwrapv -Os -Wall -Wstrict-prototypes -DENABLE_DTRACE
$ python-config --ldflags
-L/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/config -lpython2.7 -ldl -framework CoreFoundation
Скопируйте вывод в setup.py
:
from setuptools import setup
from setuptools.extension import Extension
from Cython.Build import cythonize
cflags_ucs4 = [
'-I/Library/Frameworks/Python.framework/Versions/3.6/include/python3.6m',
'-I/Library/Frameworks/Python.framework/Versions/3.6/include/python3.6m',
...
]
ldflags_ucs4 = [
'-L/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/config-3.6m-darwin',
'-lpython3.6m',
...
]
cflags_ucs4 = [...]
ldflags_ucs2 = [...]
should_build_ucs2 = False # i.e. could be passed via sys.argv
if should_build_ucs2:
cflags = cflags_ucs2
ldflags = ldflags_ucs2
else:
cflags = cflags_ucs4
ldflags = ldflags_ucs4
extensions = [
Extension('hello.py', extra_compile_args=cflags, extra_link_args=ldflags),
]
setup(
ext_modules = cythonize(extensions)
)
Тем не менее, я не рекомендую делать это, так как вы ничего не выиграете, делая это — вам все равно нужно будет создавать и распространять два отдельных пакета (один для UCS2, другой для UCS4), которые грязно поддерживать.
Вместо этого, если вы создаете колесо, которое должно быть установлено на широкий спектр дистрибутивов Linux (что, скорее всего, и является вашей реальной целью), я бы посоветовал сделать вашу сборку совместимой с PEP 513 (manylinux1
пакетов). Советую вам прочитать его, так как он мне очень помог, когда я столкнулся с проблемой раздача Linux-совместимых колес.
Теперь один из способов получить колесо, совместимое с manylinux1
, — создать колесо на своем компьютере, а затем запустить auditwheel
, чтобы проверить наличие проблем, связанных с платформой, и попытаться их решить:
$ pip install auditwheel
$ python setup.py bdist_wheel
$ # there should be now a mypkg-myver-cp36-cp36m-linux_x86_64.whl file in your dist directory
$ auditwheel show dist/mypkg-myver-cp36-cp36m-linux_x86_64.whl
$ # check what warnings auditwheel produced
$ # if there are warnings, try to repair them:
$ auditwheel repair dist/mypkg-myver-cp36-cp36m-linux_x86_64.whl
Это должно сгенерировать файл колеса с именем mypkg-myver-cp36-cp36m-manylinux1_x86_64.whl
в каталоге wheelhouse
. Еще раз проверьте, все ли в порядке, запустив auditwheel show wheelhouse/mypkg-myver-cp36-cp36m-manylinux1_x86_64.whl
. Если колесо теперь совместимо с manylinux1
, вы можете распространять его, и оно должно работать на большинстве дистрибутивов Linux (по крайней мере, с glibc; дистрибутивы с musl, такие как Alpine, не будут работать, вам нужно будет собрать отдельное колесо, если вы хотите его поддерживать).
Что делать, если auditwheel
не может отремонтировать ваше колесо? Лучший способ — использовать специальный док-контейнер, предоставленный PyPA, для создания manylinux1
-совместимых колес (это то, что я использую сам):
$ docker pull https://quay.io/repository/pypa/manylinux1_x86_64
Колесо, встроенное в этот контейнер, будет работать на большинстве дистрибутивов Linux (за исключением некоторых экзотических, таких как Alpine).
person
hoefling
schedule
27.10.2017