Cythonのインストール

2020/12/18

Windows10,Python3.6.7(64bit),Cython0.29.21

cython自体のインストールとコンパイラが必要。

Cythonのインストール

pip install cython


コンパイラの種類

Python2.7の場合
・Microsoft Visual C++ Compiler for Python 2.7

Python3の場合
・Visual Studio
・MinGW(32bit)
・MinGW-w64

Visual Studioは、Pythonのバージョンに応じて必要なバージョンをインストールする必要があるらしい。
インストーラーが必要な設定をするので、すんなりいく場合もあるはずですが、色々なトラブル(Cythonが必要なファイルを見つけられない)が出る場合もある、というか、僕はできませんでした。
VSは容量が大きいので、コンパイルだけならMinGWの方が良いのではないかと。

容量
・Visual Studio:5GB~
・MinGW:380MBくらい
・MinGW-w64:450MBくらい

MinGW-w64の設定方法

以下、WindowsでPython(64bit)環境で、MinGW-w64を使う方法です。結構めんどい。

検証環境
・Windows10 64bit
・Python3.6.7(64bit)
・Cython0.29.21

Python3.8でも同手順なのを確認。


1.MinGW-w64のインストール、および、環境変数の設定

MinGW-w64のダウンロードとインストール
https://www.javadrive.jp/cstart/install/index6.html

ダウンロード先:
http://mingw-w64.org/doku.php/download

MinGWでコンパイルするには、コマンドのオプションでコンパイラを指定する必要があります。
以下の5.参照


2.cygwinccompiler.pyの修正

設定していないと、以下のエラーがでました。

ValueError: Unknown MS Compiler version 1900


修正するファイル:C:\Python36\Lib\distutilscygwinccompiler.py
修正内容:

--- cygwinccompiler.py
+++ cygwinccompiler.py
@@ -82,7 +82,18 @@ def get_msvcr():
         elif msc_ver == '1600':
             # VS2010 / MSVC 10.0
             return ['msvcr100']
+        elif msc_ver == '1700':
+            # Visual Studio 2012 / Visual C++ 11.0
+            return ['msvcr110']
+        elif msc_ver == '1800':
+            # Visual Studio 2013 / Visual C++ 12.0
+            return ['msvcr120']
+        elif msc_ver == '1900':
+            # Visual Studio 2015 / Visual C++ 14.0
+            # "msvcr140.dll no longer exists" http://blogs.msdn.com/b/vcblog/archive/2014/06/03/visual-studio-14-ctp.aspx
+            return ['vcruntime140']
         else:
+            # to do: can we make this futureproof?
             raise ValueError("Unknown MS Compiler version %s " % msc_ver)

Pythonの求めるMSコンパイラのバージョンが、例えばversion 1916とかなら1900のところを1916に置き換える。


3.Pythonのヘッダーファイルの修正

設定しないとerror: division by zero is not a constant expressionやらwarning: division by zeroやらが出ました。

修正するファイル:%PYTHON_DIR%\include\pyconfig.h
/* Compiler specific defines */(80行あたり)の直下に下記を追加

 /* Compiler specific defines */

+#ifdef __MINGW32__
+#ifdef _WIN64
+#define MS_WIN64
+#endif
+#endif
+
 /* ------------------------------------------------------------------------*/
 /* Microsoft C defines _MSC_VER */
 #ifdef _MSC_VER


4.pexportsのインストールとコマンドの実行

何をしているかさっぱりなんですが、実行しないと以下のエラーがでます。
dllを解析して定義ファイルを作ってる?

c:/~~~~~/mingw64/bin/ld.exe: cannot find -lpthread
collect2.exe: error: ld returned 1 exit status

コマンドプロンプトで下記のコマンドを実行

mingw-get install pexports
cd C:\install_dir\Python36\
pexports vcruntime140.dll >libs\vcruntime140.def
dlltool -dllname vcruntime140.dll --def libs\vcruntime140.def --output-lib libs\libvcruntime140.a

面倒なことにmingw-getはw64版にはなく、本家MinGWをインストールする必要があるらしい。

このコマンドにより生成される2つのファイル、vcruntime140.defとlibvcruntime140.aを置いておいておきます。
求めるdllが同じならこれをPythonフォルダのlibsに保存するだけでok
https://1drv.ms/u/s!Ak5J3V_CLLtbnQqW2ZgYMm-q_taC?e=RCd7Hx

5.コンパイルのコマンド

Cythonでコンパイル時にMinGWを指定(ここは32)

setup.py build_ext --inplace --compiler=mingw32

毎回、オプションを入れたくないなら
C:\Python36\Lib\distutilsdistutils.cfgを作成して、下記の内容するとよいらしい

[build]
compiler = mingw32


情報元サイト

https://www.it-swarm-ja.tech/ja/python/valueerror%EF%BC%9A%E4%B8%8D%E6%98%8E%E3%81%AAms%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B31900/1056214524/

https://github.com/cython/cython/issues/3405