любой способ установить компиляцию cython с ucs2?

Возникла проблема при преобразовании кода Python в общий объект с помощью Cython.

установочный файл здесь:

from distutils.core import setup
from Cython.Build import cythonize
setup(
    ext_modules = cythonize("hello.py")
)

Так что все отлично работает на моем рабочем столе Ubuntu, перенесенном на CentOS.

Получил ошибку:

неопределенный символ: PyUnicodeUCS4_DecodeUTF8

Я погуглил и обнаружил, что есть много вопросов по этому поводу, но почти все они говорят, что основной причиной является python с UCS2 или UCS4, и я это понимаю, не нашел ни одного способа решить эту проблему.

ИМО, способы решения:

  1. перестройте python, чтобы получить правильную версию, с помощью "--enable-unicode=ucs4/ucs2"

Но мне нужно переустановить все пакеты

  1. Скомпилируйте код с другого десктопа, чей питон с правильным UCS

Теперь я хочу, есть ли способ настроить Cython для компиляции с указанным режимом UCS.

Любые предложения очень ценятся.

Спасибо.


person Wesley    schedule 27.10.2017    source источник


Ответы (1)


Во-первых, чтобы ответить на ваш актуальный вопрос:

Я хочу, есть ли способ настроить 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