2017-10-27 10 views
2

PythonコードをCythonで共有オブジェクトに変換するときのヒットの問題。ここucs2でcythonコンパイルを設定する方法はありますか?

セットアップファイル:

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

のCentOSに転送UTILだから、すべては私のUbuntuデスクトップ上で正常に動作します。

ガットエラー:

未定義のシンボル:PyUnicodeUCS4_DecodeUTF8

私はGoogleで検索し、この上の多くの質問がある見つけ、しかし、ほとんどすべてのが根本的な原因は、UCS2またはUCS4とのpythonであると言う、と私は理解してこれは、これを解決する方法を見せてくれませんでした。

IMO、方法は解決するために: "--enable-ユニコード= UCS4/UCS2"

によって右のバージョンを取得するのpythonを再構築

  1. しかし、私はすべてのパッケージを再インストールする必要があります

  2. は、Python右UCS
別のデスクトップからコードをコンパイル

Cythonを指定されたUCSモードでコンパイルするように設定する方法があるのですが、

ご提案いただきありがとうございます。

ありがとうございました。

答えて

2

まず、あなたの実際の質問に答えるために:

I wanna if there is way to set Cython to compile with specified UCS mode.

することができますbuild a separate python installation from sourceをし、そのヘッダに対してCythonをリンクします。ヘッダーを見つけるには、ツール(またはPython 3の場合はpython3-config)を使用します。 setup.py

$ # 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 

コピー出力を::通常python実行ファイルがあるbinディレクトリに配置されて

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) 
) 

あなたが「勝ったとしてしかし、私はそれを行うことはお勧めしません。それを行うことで何も勝つことはできません - あなたはまだ2つの別々のパッケージ(UCS2のパッケージとUCS4のパッケージ)をビルドして配布する必要があります。

代わりに、幅広いLinuxディストリビューションにインストール可能なホイールを構築する場合(おそらく実際の目標は何か)、私はあなたのビルドをPEP 513manylinux1パッケージ)に適合させることを提案します。 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というホイールファイルがあります。 auditwheel show wheelhouse/mypkg-myver-cp36-cp36m-manylinux1_x86_64.whlを実行して、すべて正常であることを再度確認してください。ホイールがmanylinux1と一貫していれば、それを配布することができます。 Linuxディストリビューション(少なくともglibcを使用しているディストリビューション、Alpineのようなmuslディストリビューションは動作しません。それをサポートしたい)。

auditwheelがホイールを修理できない場合はどうすればよいですか?最良の方法はmanylinux1準拠ホイールを構築するためのPyPAによって提供される特別なドッキングウィンドウコンテナを引っ張っている(これは私が自分自身を使用しているものです):

$ docker pull https://quay.io/repository/pypa/manylinux1_x86_64 

このコンテナの内側に構築されたホイールは、Linuxのほとんどで動作しますディストロ(アルパインのようなエキゾチックなものを除く)。

関連する問題