このチュートリアルに従って、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を使い始めるときに重要になります。
どうもありがとう!
_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もされません。
コンパイルに関する公式ドキュメント によると、Python言語レベルは、次のように、ファイルの上部にある特別なヘッダーコメントを介してディレクティブを使用して指定できます。
#!python
#cython: language_level=3
Setup.pyでこれを指定する方法がないようです。したがって、Cythonファイルが多数ある場合は、各ファイルにコンパイラディレクティブを追加する必要があります。これまでにこのディレクティブを必要とする唯一の状況は、サンプルのようにprint()に関するものですが、私はCythonを広範囲に使用しました。
次のように、拡張子付きの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