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++がコンパイルする 事になります。