用ucs2设置cython编译的任何方法?

时间:2017-10-27 06:08:04

标签: python cython cythonize

通过Cython将python代码转换为共享对象时遇到问题。

设置文件:

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

所以在我转移到CentOS的Ubuntu桌面工具上一切正常。

收到错误:

未定义的符号:PyUnicodeUCS4_DecodeUTF8

我用谷歌搜索并发现有很多问题,但是,几乎所有人都说根本原因是使用UCS2或UCS4的python,我明白这一点,没有找到一个展示方法来解决这个问题。

IMO,解决方法:

  1. 重建python以获得正确的版本" - enable-unicode = ucs4 / ucs2"
  2. 但我需要重新安装所有软件包

    1. 编译其中具有正确UCS的
    2. 的python的另一个桌面的代码

      现在,我想是否有办法将Cython设置为使用指定的UCS模式进行编译。

      非常感谢任何建议。

      感谢。

1 个答案:

答案 0 :(得分:2)

首先,回答你的实际问题:

  

我想是否有办法将Cython设置为使用指定的UCS模式进行编译。

您可以build a separate python installation from source并将Cython与其标题相关联。要查找标头,您可以使用python-config工具(或{3}}用于Python 3)。它通常位于python3-config可执行文件所在的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

但是,我不建议这样做,因为你不会通过这样做赢得任何东西 - 你仍然需要构建和分发两个独立的软件包(一个用于UCS2,另一个用于UCS4),维护起来很麻烦。

相反,如果你要构建一个可以安装在各种Linux发行版上的轮子(最可能是你的实际目标),我建议你使用PEP 513({{1}我建议你阅读它,因为当我遇到分发Linux兼容轮子的问题时,它对我非常有帮助。

现在,获得符合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) ) 标准的轮子的一种方法是在您的计算机上构建轮子,然后运行manylinux1以检查特定于平台的问题并尝试解决它们:

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 的wheel文件。通过运行mypkg-myver-cp36-cp36m-manylinux1_x86_64.whl再次检查一切正常。如果轮子现在与wheelhouse一致,你可以分发它,它应该在大多数 Linux发行版上工作(至少那些有glibc的人;像阿尔卑斯山这样的musl发行的人都不会工作,如果你想支持它,你需要建立一个单独的轮子。​​)

如果auditwheel show wheelhouse/mypkg-myver-cp36-cp36m-manylinux1_x86_64.whl无法修理您的车轮,您应该怎么做?最好的方法是拉一个由PyPA提供的特殊码头集装箱,用于构建符合manylinux1标准的车轮(这就是我自己使用的):

auditwheel

这个容器内置的一个轮子可用于大多数Linux发行版(不包括一些像Alpine这样的异国情调)。