web-dev-qa-db-ja.com

Cythonのsetup.pyでPython 3ソースを指定する方法は?

このチュートリアルに従って、Cythonで「Hello World」プログラムを実行しようとしています http://docs.cython.org/src/tutorial/cython_tutorial.html#cython-hello-world

Helloworld.pyxを作成しました

print("Hello World")

そしてsetup.py:

from distutils.core import setup
from Cython.Build import cythonize

setup(
    ext_modules = cythonize("helloworld.pyx")
)

ソースがPython 2ではなく、チュートリアルのようにPython 3)であることを指定するようにsetup.pyを変更するにはどうすればよいですか? "cython"コマンドを呼び出す場合コマンドラインからは-3オプションを受け入れますが、チュートリアルで示すようにpython setup.py build_ext --inplaceでコンパイルする場合、Python 3 source? Hello Worldプログラムにとっては非常に重要ですが、実際のプロジェクトでCythonを使い始めるときに重要になります。

どうもありがとう!

27
rsteward

_language_level_をオプションとして を_setup.py_- scriptのcythonize-関数に渡すことができます:

_extensions = cythonize(extensions, compiler_directives={'language_level' : "3"})) # or "2" or "3str"
_

または、スクリプトをPython2で_language_level=2_およびPython3で_language_level=3_として解釈する必要がある場合(IPythonの%% cython-magicの動作):

_import sys
# passing 3 or 2 as integer is also accepted:
cythonize(extensions, compiler_directives={'language_level' : sys.version_info[0]})
_

別の可能な構文は

_extensions = cythonize(extensions, language_level = "3")
_

上記は追加するよりも便利かもしれません

_#cython: language_level=3
_

cython 0.29以降、_language_level_ 明示的に設定されていない の場合、警告が表示されるため、プロジェクト内のすべてのpyxファイルに必要になる可能性があります

/Main.py:367:FutureWarning:Cythonディレクティブ 'language_level'が設定されていません。今のところ2(Py2)を使用しています。これは今後のリリースで変更されます!ファイル:XXXXXX.pyx
tree = Parsing.p_module(s, pxd, full_module_name)


_language_level_はグローバル設定であるため、デコレータ

_cimport cython

@cython.language_level("3")
def do_something():
    pass
_

cythonizedもされません。

15
ead

コンパイルに関する公式ドキュメント によると、Python言語レベルは、次のように、ファイルの上部にある特別なヘッダーコメントを介してディレクティブを使用して指定できます。

#!python
#cython: language_level=3

Setup.pyでこれを指定する方法がないようです。したがって、Cythonファイルが多数ある場合は、各ファイルにコンパイラディレクティブを追加する必要があります。これまでにこのディレクティブを必要とする唯一の状況は、サンプルのようにprint()に関するものですが、私はCythonを広範囲に使用しました。

9
Yan Li

次のように、拡張子付きのsetup.pyを使用している場合 example

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext

ext_modules = [
    Extension("mymodule1",  ["mymodule1.py"]),
    Extension("mymodule2",  ["mymodule2.py"]),
]

setup(
    name = 'My Program Name',
    cmdclass = {'build_ext': build_ext},
    ext_modules = ext_modules
)

その後、次のスニペットを追加して、language_levelディレクティブを適用する必要があります。

for e in ext_modules:
    e.cython_directives = {'language_level': "3"} #all are Python-3
1
Galland