7. Cythonでの注意点¶
これまでにCPython2/3について述べた事について注意を払えば、 Cythonのソースコード(.pyx)は python2/python3の双方で使うことができます。
Cythonはソースコード (.pyx) からCあるいはCPPのソースコードを作成 します。 注意すべきは、同じ Cythonのソースコード(.pyx) からpython2/Cythonで作成されたc/cppコードとpython3/Cythonで作った c/cppコードには微秒な違いがあります。 Python2/Cython および Python3/Cython の双方でExtensionを作成する場合、同じpyxファイル名を使って python2/pythoん3の双方でそれぞれExtensionを作成する場合、 ビルドの前にcythonが生成したC/C++のソースコードを消去しておく 必要があります。 私が作成した Python_CA、およびcVXI11モジュールでは、 Cythonソースコード(cVXI11.pyxなど)のリンク(cVXI11-2.pyx および cVXI11-3.pyx)を作成しておき、setup.py中では、
# cVXI11-2.pyx and cVXI11-3.pyx are hard links to cVXI11.pyx
cVXI11_source_PY2="cVXI11-2.pyx"
cVXI11_source_PY3="cVXI11-3.pyx"
if sys.version_info >= (3,):
cVXI11_source=cVXI11_source_PY3
else:
cVXI11_source=cVXI11_source_PY2
if not os.path.exists(cVXI11_source):
os.link("cVXI11.pyx", cVXI11_source)
などとしています。これにより、同じpyxソースコードで、python2/python3では、 それぞれ cVXI11-2.cpp, cVXI11-3.cppをcythonが作成し、これをC++がコンパイルする 事になります。