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\distutils
のcygwinccompiler.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\distutils
にdistutils.cfg
を作成して、下記の内容するとよいらしい
[build]
compiler = mingw32
情報元サイト