Windows10+python3.6.6でpycryptoは動かない…

# C++をコンパイルできない…


以下のエラーは、WindowsでPythonの環境設定を行う際によく遭遇するエラーです。

error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-tools

というのも、Pythonのライブラリの多くはC言語を利用しており、コンパイルが必要です。しかし、Windowsにはデフォルトでコンパイラが含まれていないため、自分でインストールする必要があります。したがって、C++のコンパイラをインストールするとエラーは解消されます。ただし、エラーメッセージ内のリンクが古くなっており、アクセスできないのは残念ですが…

解決法

以下のリンクからビルドツールをインストールするのが良いです。Visual Studio IDEが既にインストールされている場合は、下記のリンクから対応するVisual Studioのバージョンに合わせたC++のビルドツールのインストーラーをダウンロードしてインストールしましょう。https://www.microsoft.com/en-us/download/developer-tools.aspx Visual Studio IDEがインストールされていない場合は、インストールしましょう。その際に、オプションでC++のビルドツールも一緒にインストールすることをおすすめします。Visual Studio Codeとの混同に注意してください。さらに、古いsetuptoolsはVisual Studio 2017に対応していないため、アップデートも行いましょう。

 pip install --upgrade setuptools

ビルドツールのインストール後もエラーが発生する場合…


これで解決すると思って再度pycryptoをインストールすると、コンパイルエラーが発生します…これは構文エラーのため、ソースコードとコンパイラの互換性が悪いようです。

C:\Program Files (x86)\Windows Kits\10\include\10.0.17134.0\ucrt\inttypes.h(27): error C2061: 構文エラー: 識別子 'intmax_t'
C:\Program Files (x86)\Windows Kits\10\include\10.0.17134.0\ucrt\inttypes.h(28): error C2061: 構文エラー: 識別子 'rem'
C:\Program Files (x86)\Windows Kits\10\include\10.0.17134.0\ucrt\inttypes.h(28): error C2059: 構文エラー: ';'
C:\Program Files (x86)\Windows Kits\10\include\10.0.17134.0\ucrt\inttypes.h(29): error C2059: 構文エラー: '}'
C:\Program Files (x86)\Windows Kits\10\include\10.0.17134.0\ucrt\inttypes.h(31): error C2061: 構文エラー: 識別子 'imaxdiv_t'
C:\Program Files (x86)\Windows Kits\10\include\10.0.17134.0\ucrt\inttypes.h(31): error C2059: 構文エラー: ';'
C:\Program Files (x86)\Windows Kits\10\include\10.0.17134.0\ucrt\inttypes.h(41): error C2143: 構文エラー: '{' が '__cdecl' の前にありません。
C:\Program Files (x86)\Windows Kits\10\include\10.0.17134.0\ucrt\inttypes.h(42): error C2146: 構文エラー: ')' が、識別子 '_Number' の前に必要です。
C:\Program Files (x86)\Windows Kits\10\include\10.0.17134.0\ucrt\inttypes.h(42): error C2061: 構文エラー: 識別子 '_Number'
C:\Program Files (x86)\Windows Kits\10\include\10.0.17134.0\ucrt\inttypes.h(42): error C2059: 構文エラー: ';'
C:\Program Files (x86)\Windows Kits\10\include\10.0.17134.0\ucrt\inttypes.h(43): error C2059: 構文エラー: ')'
C:\Program Files (x86)\Windows Kits\10\include\10.0.17134.0\ucrt\inttypes.h(46): error C2143: 構文エラー: '{' が '__cdecl' の前にありません。
C:\Program Files (x86)\Windows Kits\10\include\10.0.17134.0\ucrt\inttypes.h(47): error C2146: 構文エラー: ')' が、識別子 '_Numerator' の前に必要です。
C:\Program Files (x86)\Windows Kits\10\include\10.0.17134.0\ucrt\inttypes.h(47): error C2061: 構文エラー: 識別子 '_Numerator'
C:\Program Files (x86)\Windows Kits\10\include\10.0.17134.0\ucrt\inttypes.h(47): error C2059: 構文エラー: ';'
C:\Program Files (x86)\Windows Kits\10\include\10.0.17134.0\ucrt\inttypes.h(47): error C2059: 構文エラー: ','
C:\Program Files (x86)\Windows Kits\10\include\10.0.17134.0\ucrt\inttypes.h(49): error C2059: 構文エラー: ')'
C:\Program Files (x86)\Windows Kits\10\include\10.0.17134.0\ucrt\inttypes.h(51): error C2143: 構文エラー: '{' が '__cdecl' の前にありません。
C:\Program Files (x86)\Windows Kits\10\include\10.0.17134.0\ucrt\inttypes.h(57): error C2143: 構文エラー: '{' が '__cdecl' の前にありません。
C:\Program Files (x86)\Windows Kits\10\include\10.0.17134.0\ucrt\inttypes.h(64): error C2143: 構文エラー: '{' が '__cdecl' の前にありません。
C:\Program Files (x86)\Windows Kits\10\include\10.0.17134.0\ucrt\inttypes.h(70): error C2143: 構文エラー: '{' が '__cdecl' の前にありません。
C:\Program Files (x86)\Windows Kits\10\include\10.0.17134.0\ucrt\inttypes.h(77): error C2143: 構文エラー: '{' が '__cdecl' の前にありません。
C:\Program Files (x86)\Windows Kits\10\include\10.0.17134.0\ucrt\inttypes.h(83): error C2143: 構文エラー: '{' が '__cdecl' の前にありません。
C:\Program Files (x86)\Windows Kits\10\include\10.0.17134.0\ucrt\inttypes.h(90): error C2143: 構文エラー: '{' が '__cdecl' の前にありません。
C:\Program Files (x86)\Windows Kits\10\include\10.0.17134.0\ucrt\inttypes.h(96): error C2143: 構文エラー: '{' が '__cdecl' の前にありません。
error: command 'C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.15.26726\bin\HostX86\x64\cl.exe' failed with exit status 2

解決策はありますか?


Googleで検索してみると、同様の問題に直面している人がいたため、次のような解決策が提案されていました。

以下のワークアラウンドが見つかりました:http://www.xavierdupre.fr/app/pymyinstall/helpsphinx/blog/2017/2017-01-03_pycrypto.html 本当に醜い解決策ですが、有効です ;-).

参考元:https://github.com/dlitz/pycrypto/issues/216 上記の回答内のリンク先では、次のように解決策が提案されています。ソースコード(inttypes.h)を以下のように編集することです。

define intmax_t long long

を以下のように修正します。

define uintmax_t unsigned long long

しかし、これは手間なので、Pythonのバージョンを下げることにしました…

コメント

タイトルとURLをコピーしました