web-dev-qa-db-ja.com

Windowsx64でのPythonモジュールのコンパイル

私は単語処理のいくつかのプロジェクトを始めており、NumPyとNLTKが必要でした。 easy_installと、pythonの新しいモジュールをシステムにコンパイルする方法を知るのはこれが初めてでした。

Python 2.7 x64 plus VS11およびVS12もあります。Cygwin(私が推測する最新のもの)もあります。VSを使用してコンパイルしたファイルで、同じVSenvを検索することがわかりました。 pythonコード、なぜ?私のバージョンである11.0をハードコーディングしたとき、numpyはvcvarsallに関するいくつかの奇妙なエラーに基づいてビルドできませんでした(vcvarsallが見つかり、おそらく誤用されました)。

Windowsでpythonバイナリをビルドできませんか?そうでない場合は、Linux for Windowsでクロスコンパイルできますか?(Android)でGoogleと同じ方法を使用します) SDK)

17
codeScriber

更新:この回答は5年以上経過しています! Python-2.7は非推奨になりそうなので、本当に必要なのはPython-3用のMicrosoft VisualCコンパイラです。 this Python wiki on MS Windows Compilers 。MS Build Tools 2015 with VC-14.0は、Python-3.5および3.6の拡張機能をビルドするために必要なものです。古い MSビルドツール2015 VC-14.0を含むか新しい 2017のMSビルドツール -リンクをクリックして、見つかるまで下にスクロールします- Visual Studio 2017のビルドツール -これにはVC-14.0も含まれます。

また、pipとsetuptoolsのバージョンが最新の場合は、そのばかげた古い学校のMSSDKナンセンスをすべて無視できます。特に、VC for Python 2.7またはMSビルドツール2015を使用している場合。setuptools-24以降、これらのコンパイラを探す場所がわかっているだけです。 。

更新:Zooba 下記のとおり、 Python-2.7用の無料のx86およびAMD64(x86-64)VC90cコンパイラはMicrosoftから入手可能になりました

更新:パッチ_vcvarsall.bat_ 代わりに任意のシェルでpipを使用してSDKv7.0のx64コンパイラを直接使用するSDK Shellを使用し、以下の指示に従って_DISTUTILS_USE_SDK_およびMSSdk環境変数を設定します。 vcvarsall.batを修正してPython-2.7 x64拡張機能をsdk7ではなくv90でインストールするを参照してください。

tl; dr: Windows SDK v7.0コンパイラを使用し、SDKシェルを開いてを呼び出します。

_C:\> setenv /release /x64
C:\> set DISTUTILS_USE_SDK=1
C:\> MSSdk=1
_

distutils、pipまたは_easy_install_を使用してPython 2.7.x拡張機能をビルドする。 Python x64 Package Extensions with pip 、MSVC 2008 Express&SDK 7

:インストールできます ChristophGohlkeのIntelMKLを使用して最適化されたNumpy 。 virtualenvの場合は、バイナリ配布ウィンドウインストーラーをpipでインストールできる wheel ファイルに変換してみてください。ソースからの構築 NumPynot些細なことです。 OpenBLASGotoBLAS のフォークの最近の導入と可用性により可能になりました。 Windows x86およびx86-64で利用可能な最適化されたバイナリ およびGotoBLASまたは [〜#〜] atlas [〜#〜] よりもコンパイルが比較的簡単なソースがあります。 。

:これまで、ソースからNumPyをコンパイルすることはお勧めしませんでした。これは、非常に時間のかかるプラットフォーム用にBLASを最適化する必要があり、参照BLAS(FORTRAN)またはCBLAS(C/C++)の実装は比較的パフォーマンスが低かった。また、NumPyは [〜#〜] lapack [〜#〜] に依存します。これは、NumPyを構築するための追加のハードルもBLASに依存します。ただし、OpenBLASバイナリはすでにLAPACKでコンパイルされているため、この障害はすでに解消されています。 Windows上でOpenBLASを使用してNumPyを構築するためのCarl Kleffnerの静的MinGW-w64ツールチェーン -彼はABIの非互換性のいくつかを解決し、正しいMicrosoft Visual C共通ランタイムライブラリ(_msvcr90.dll_ for Python-2.7)。

したがって、Windows 7x64へのPython拡張機能のインストールに関する主な質問に進みます。

拡張機能をコンパイルするための推奨される方法は、Python共有ライブラリ[1-3]のコンパイルに使用したものと同じコンパイラを使用することです。 公式Python 2.7.x for WindowsMicrosoft Visual Studio 2008ProfessionalのMicrosoftVisual C++コンパイラバージョン9.0 [4](別名MSVC90または単にVC90) を使用してコンパイルされました。これは無料で入手できる可能性があります。 from Microsoft DreamSpark 。明らかにx64コンパイラはデフォルトでインストールされていないため、x86コンパイラと一緒にインストールされていることを確認してください。注:MS Visual Studio2008はインストールされていない可能性があります。利用可能ですが、MS Visual Studio 2010をインストールすると、MSVC90ツールチェーンを使用できるようになります。MSVC90ツールチェーンは、Windows SDK7からインストールできます。

コマンドラインからPythonインタープリターを実行するときにヘッダーを確認することで、pythonが構築されたバージョンを知ることができます。egPython 2.7.3 (default, Apr 10 2012, 23:24:47) [MSC v.1500 64 bit (AMD64)] on win32は、VS 2008 C++でビルドされたことを意味します。ソースからPython自分でビルドできますが、これも骨の折れる作業です。一般に、コンパイラランタイムを混在させることはお勧めしませんが、実際には、それらが引き続き機能する場合があります。

GNU GCC を使用することに心を決めている場合は、 MinGW はネイティブx86アプリケーション専用であるため、 mingw-w64 を使用する必要があります。 AMD64/x86-64ではありません。あなたはする必要があります

ただし、最終的にはstillpythonで構築されたランタイム、_msvcr90.dll_に対してリンクする必要があるため、 Visual C++ 2008再配布可能注:mingw-w64のWindows GCCは _msvcrt.dll_を使用します。これは_msvcr90.dll_以降と同じではありません。

無料でやりたい場合は、 Microsoft Visual C++ 2008 Express SP1 を使用できますが、 Windows SDK 7 for .NET Frameworks 3.5 SP1 を追加する必要があります。バージョンはnot x64コンパイラを持っています。 VS2008 Express&SDK7でx64C++拡張機能をインストールする手順は、 Windows x64拡張機能のcythonサイト の手順と非常によく似ています。 注:MS Visual Studio 2008 Expressは使用できなくなったか、サポートされなくなりました。

参考:Microsoftコンパイラを使用してビルドするのに必ずしもVisualStudioは必要ありません。これらは、適切なSDKパッケージとともに無料で入手できます。 _CL.EXE_はコンパイラの実行可能ファイルですが、AutotoolsまたはCMAKEなどの他のツールによって通常設定されるプラットフォームオプションを設定する必要があります。 CMAKEはMSVCでうまく機能しますが、Autotools AFAIKはMSVCで機能せず、Windowsでは [〜#〜] msys [〜#〜] で利用できるいくつかのPOSIX環境とユーティリティが必要になります。

Distutilsまたはsetuptoolsを使用する多くのPythonパッケージの場合、リファレンスドキュメントおよびwikiを通じてさまざまな場所に掲載されている指示に従って、Windows SDK7を使用して拡張機能をコンパイルできます。

  1. スタートメニューからすべてのプログラムを選択し、次にMicrosoft Windows SDK v7.を選択してCMDシェルを開始してコマンドを開きますWindowsSDK用に最適化されたウィンドウ。
  2. 手順1は、スタートメニューまたはコマンドプロンプト(別名_C:\Windows\System32\cmd.exe_)から実行ボックスに次のように入力するのと同じです。

    _%COMSPEC% /E:ON /V:ON /K "%PROGRAMFILES%\Microsoft SDKs\Windows\v7.0\Bin\SetEnv.cmd"
    _

    注:_/E:ON_が機能するには、コマンド拡張を有効にするフラグ_/V:ON_と遅延変数展開を有効にする_SetEnv.cmd_の両方が必要です。そうでない場合、x64というメッセージが表示されます。コンパイラがインストールされていない、&c。

  3. 次に、_setenv /Release /x64_と入力します。これにより、Windows 7 x64リリース専用のSDK環境変数が設定されます(vs debugまたはx86がデフォルトです)。

  4. _set DISTUTILS_USE_SDK=1_を入力してreturnキーを押し、次に_set MSSdk=1_と入力して戻り、SDKを使用していることとSDKがすべての環境変数を決定することを_distutils.msvccompiler_に伝えます。
  5. 次に、選択したインストール方法を使用します:
    • _pip install pyyaml ntlk_が推奨される方法です、 ntlkを参照 ですが、 setuptools および pip がインストールされている必要があります。
    • _python setup.py install_ダウンロード、抽出されたtarballごとに
    • _easy_install pyyaml ntlk_これは古い方法であり、卵をインストールする唯一の方法です。

[1] WindowsでのCおよびC++拡張機能の構築
[2] distutils.msvccompiler — Microsoftコンパイラ
[3] Python開発ガイド:はじめに:Windows
[4] これはVisualStudioのどのバージョンですかpythonコンパイル済み

32
Mark Mikofski

他の回答以来、MicrosoftはPython 2.7(およびVS 2008/VC9を使用したPython)の任意のバージョン)の拡張機能を構築するためのコンパイラパッケージをリリースしました。使用方法は次のとおりです。

  1. http://aka.ms/vcpython27 に移動し、パッケージをダウンロードしてインストールします(パッケージはかなり小さく、管理者権限は必要ありません)

  2. Setuptoolsを6.0以降に更新します(pip install -U setuptools

  3. パッケージをインストールします(pip install <whatever>

最新のsetuptoolsバージョンとこのコンパイラパックの組み合わせにより、これを非常に簡単に行うことができます。

11
Zooba

これは私にとって最もうまくいきました:

  1. インストール_Visual Studio Express 2008_
  2. _Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 SP1_を http://www.Microsoft.com/en-us/download/details.aspx?id=3138 からインストールします。
  3. C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\binに移動し、_Visual Studio 2008 x64 Win64 Command Prompt_を開きます
  4. そのシェルで、_pip install <package>_を実行します

この方法で行う場合、クライアントシステムに再配布可能なパッケージをインストールする必要はありません。

0
frmdstryr

どうやらそれを行うにはいくつかの方法があります。

  1. mingwを使用してビルド
  2. ビルドpython 2.7 VS 2008Expressを使用。
  3. どのバージョンが3.2をビルドするのに適しているかはわかりませんが、VS2010である可能性があります。
  4. 目的のVSを使用してソースからpython x64をコンパイルできますが、他のビルド済みパッケージとの互換性の問題が発生します。
0
codeScriber

Windows 10の場合、Python 2.7.11、Cygwin2.5.2およびx86_64-w64-mingw32-gcc4.9.2または5.4.0(ただし、1の下のを参照)以下)、他の場所からのコメントをまとめて、これが私のPython拡張機能をコンパイル、リンク、およびmsvcrt.dllとmsvcr90.dll間の競合条件を打ち負かすために私がしなければならなかったことです:

  1. Distutils/cygwinccompilerを編集し、class Mingw32CCompiler

    • 古い-mno-cygwin修正を次のように置き換えます

      if self.gcc_version < '4' or is_cygwingcc():
        no_cygwin = ' -nostdlib -lgcc'
      

      gcc4.9.2の場合--- 5.4.0の場合、「if」はありません。

      no_cygwin = ''
      
    • 適切なコンパイラを配置します。

              self.set_executables(compiler='x86_64-w64-mingw32-gcc%s -O -Wall' % no_cygwin,
                       compiler_so='x86_64-w64-mingw32-gcc%s -mdll -O -Wall' % no_cygwin,
                       compiler_cxx='x86_64-w64-mingw32-g++%s -O -Wall' % no_cygwin,
                       linker_exe='x86_64-w64-mingw32-gcc%s' % no_cygwin,
                       linker_so='x86_64-w64-mingw32-%s%s %s %s'
      
    • x86_64-w64-mingw32-gcc 5.4.0の場合、より適切に機能するようですwithout msvcr90なので、get_msvcr条件付きで呼び出します。

              if self.gcc_version < '5':
                  self.dll_libraries = get_msvcr()
      
  2. 次のようにsetup.pyを使用します

    libdirs=['C:\\Python27\\libs',...]
    macros=[('MS_WIN64','1'),...]
    platform="WIN32"
    
  3. ソースファイルヘッダーの1つにパッチを適用して含める

    #ifdef MS_WIN64
    #define strdup _strdup
    #endif
    
  4. 最後に、

     /c/Python27/python [editted setup].py -v build --compiler=mingw32
     /c/Python27/python [editted setup].py -v install
    

上記のいくつかは完全に最適な場所ではないかもしれませんが、それは私の拡張機能を機能させました...

0
HST