Компиляция модулей Python на Windows x64



Я начинаю некоторые проекты по обработке слов, и мне нужны NumPy и NLTK.
Это был первый раз, когда я узнал easy_install и как скомпилировать новый модуль python в систему.



У меня есть Python 2.7 x64 plus VS 11 и VS 12. Также Cygwin (последний, я думаю).
Я мог видеть в файле, который компилируется с помощью VS, что он ищет VS env с той же версией, что и тот, который компилировал код python, почему?
Когда я жестко 11.0 это моя версия, включает в себя не несколько странных ошибок относительно vcvarsall (он нашел vcvarsall, вероятно, неправильно его использовал).



Нельзя ли построить двоичные файлы python на Windows?
Если нет, Могу ли я скомпилировать кросс на Linux для Windows? (используя тот же метод, что и Google для Android SDK)

682   5  

5 ответов:

обновление: этому ответу уже более 5 лет! Python-2.7 скоро устареет, поэтому вам действительно нужен компилятор Microsoft Visual C для Python-3. Взгляните на эту Python wiki на компиляторах MS Windows. MS Build Tools 2015 с VC-14.0 - это то, что вам нужно для сборки расширений для Python-3.5 и 3.6. Вы можете либо установить более старые MS build tools 2015, которые включают VC-14.0, либо более новые MS build tools for 2017 - нажмите на ссылку, затем прокрутите вниз, пока не найдете Build Tools for Visual Studio 2017 - который также включает VC-14.0.

кроме того, если ваши версии pip и setuptools актуальны, то вы можете игнорировать всю эту глупую старую школу MSSDK ерунды. Особенно если вы используете VC для Python 2.7 или MS build tools 2015. Поскольку setuptools-24, он просто знает, где искать эти компиляторы, надеюсь.

обновление: Как Zooba упоминает ниже, бесплатные x86 и AMD64 (x86-64) VC90 c-компиляторы для Python-2.7 теперь доступны от Microsoft .

обновление: патч vcvarsall.bat использовать компиляторы x64 из SDK v7. 0 непосредственно с pip в любой оболочке вместо использования оболочки SDK и установки переменных окружения DISTUTILS_USE_SDK и MSSdk, как показано ниже. Смотрите Fix vcvarsall.bat для установки расширений Python-2.7 x64 с v90 вместо sdk7 .

tl; dr: используйте Windows Компиляторы SDK v7. 0, откройте оболочку SDK и вызовите

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

построить Python 2.7.X расширения, использующие distutils, pip или easy_install. Смотритерасширения пакетов Python x64 с pip, MSVC 2008 Express & SDK 7 .

Примечание : Вы можете установить numpy оптимизированный с помощью Intel MKL от Christoph Gohlke. Для virtualenv попробуйте преобразовать двоичный дистрибутив Windows installer в файлwheel , который можно установить с помощью pip. Здание NumPy из источника являетсяне тривиальным. Это стало возможным с недавним введением и наличием OpenBLAS, развилки GotoBLAS. Существуютоптимизированные двоичные файлы, доступные для Windows x86 и x86-64 , а также исходный код, который относительно проще компилировать, чем GotoBLAS илиATLAS .

Примечание : в прошлом я не рекомендовал компилировать NumPy из исходного кода, потому что вам нужно было оптимизировать BLAS для вашего платформа, которая была очень трудоемкой, и реализации эталонных BLAS (FORTRAN) или CBLAS (C/C++) были относительно низкоэффективными. Также NumPy зависит отLAPACK , который также зависит от BLAS дополнительное препятствие для построения NumPy. Однако двоичные файлы OpenBLAS уже компилируются с помощью LAPACK, поэтому это препятствие уже устранено. Смотрите статические цепочки инструментов MinGW-w64 Карла Клеффнера для сборки NumPy с OpenBLAS на Windows - он разрешил некоторые из ABI несовместимости и проблемы, связанные с правильной библиотекой Microsoft Visual C Common Runtime library (msvcr90.dll для Python-2.7).

Итак, перейдем к главному вопросу об установке расширений Python на Windows 7 x64.

Рекомендуемый способ компиляции расширений-использовать тот же компилятор, который используется для компиляции общей библиотеки Python [1-3]. Официальный Python 2.7.x для Windows был скомпилирован с помощью компиляторов Microsoft Visual C++ версии 9.0 [4] (он же MSVC90 или просто VC90) от Microsoft Visual Studio 2008 Professional , который вы можете получить бесплатно от Microsoft DreamSpark. Очевидно, что компиляторы x64 не установлены по умолчанию, поэтому убедитесь, что они установлены вместе с компиляторами x86. Примечание: MS Visual Studio 2008 может больше не быть доступна, но MS Visual Studio 2010 позволит вам использовать набор инструментов MSVC90, если он установлен, который может быть установлен из Windows SDK7.

Вы можете сказать, какая версия вашего Python был построен с помощью просмотра заголовка при выполнении интерпретатора python из командной строки. напр.: Python 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-w64 , потому что MinGW предназначен только для собственных x86-приложений, а не для AMD64/x86-64. Вам нужно будет

Однако в конце концов вам все равно нужно будет связать со средой выполнения, с которой был построен python, msvcr90.dll, поэтому вам понадобится Visual C++ 2008 redistributable . Примечание: Windows GCC от mingw-w64 использует msvcrt.dll что не то же самое, что msvcr90.dll или позже.

Если вы хотите сделать это бесплатно, вы можете использовать Microsoft Visual C++ 2008 Express SP1 но вам будет нужно добавить SDK для Windows 7 для .Чистая рамки 3.5 с пакетом обновления 1, потому что экспресс-версия не есть x64 компиляторы. Процедура установки расширений x64 C++ с помощью VS2008 Express & SDK 7 очень похожа на процедуру установки расширений cython для Windows x64 extensions. Примечание: MS Visual Studio 2008 Express больше не доступна и не поддерживается.

К вашему сведению: вам не обязательно нужна Visual Studio для сборки с помощью Microsoft компиляторы. Они доступны бесплатно с соответствующим пакетом SDK. CL.EXE является исполняемым файлом компилятора, но вам придется установить любые параметры платформы, которые обычно настраиваются Autotools или каким-либо другим инструментом, таким как CMAKE. CMAKE хорошо работает с MSVC, но Autotools AFAIK не работает с MSVC и потребует некоторой среды POSIX и утилит, которые в Windows доступны в MSYS.

Для многих пакетов Python, использующих distutils или setuptools, они могут компилироваться расширения с помощью Windows SDK 7, следуя инструкциям, которые размещены в различных местах через справочную документацию и Вики:

  1. из меню пуск выберите Все программы затем Microsoft Windows SDK v7.0 и запустите CMD Shell, чтобы открыть окно команд, оптимизированное для Windows SDK.
  2. Шаг #1 эквивалентен вводу следующего текста в поле выполнить из меню пуск или из Командная строка (aka 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 не установлены, и т. д.

  3. Затем введите setenv /Release /x64, который установит переменные среды SDK специально для выпуска Windows 7 x64 (vs debug или x86, которые используются по умолчанию).

  4. тип set DISTUTILS_USE_SDK=1 возврат хита и затем введите set MSSdk=1 и вернитесь, чтобы сообщить distutils.msvccompiler, что вы используете SDK, и что SDK определит все переменные среды.
  5. теперь используйте выбранный вами метод установки:
    • pip install pyyaml ntlk который является рекомендуемым способом, смотрите ntlk, но вы должны иметь setuptools и pip установленные.
    • python setup.py install для каждого загруженного, извлеченного тарбола
    • easy_install pyyaml ntlk который является старым способом и единственным способом установить яйца.

[1] построение расширений C и C++ в Windows
[2] distutils.msvccompiler-компилятор Microsoft
[3] Python Dev Guide: Начало Работы: Windows
[4] в какой версии visual studio этот python скомпилирован с

После других ответов Microsoft выпустила пакет компилятора специально для построения расширений для Python 2.7 (и любой версии Python, которая использовала VS 2008/VC9). Вот как его использовать:

  1. Перейти к http://aka.ms/vcpython27 , загрузите и установите пакет (он довольно мал и не требует прав администратора)

  2. Обновите setuptools до версии 6.0 или более поздней (pip install -U setuptools)

  3. Установите свой пакет (pip install <whatever>)

В сочетание последней версии setuptools и этого пакета компиляторов должно сделать это очень легко.

Очевидно, есть несколько способов сделать это.

  1. сборка с использованием mingw
  2. Сборка python 2.7 с использованием VS 2008 express.
  3. я не уверен относительно того, какая версия хороша для сборки 3.2, но это может быть VS 2010.
  4. Вы можете скомпилировать python x64 из исходного кода, используя желаемый VS, но у вас будут проблемы с совместимостью с другими предварительно построенными пакетами.

Это сработало лучше всего для меня:

  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>

Вам не нужно устанавливать какие-либо распространяемые пакеты на клиентские системы, когда это делается таким образом.

Для Windows 10, Python 2.7.11, Cygwin 2.5.2 и x86_64-w64-mingw32-gcc 4.9.2 или 5.4.0 (но смотрите Примечание под 1 ниже), собирая комментарии из других источников, вот что я должен был сделать для моего расширения Python, чтобы скомпилировать, связать и победить условие гонки между msvcrt.dll и msvcr90.dll:

  1. Редактировать distutils / cygwinccompiler, а также в class Mingw32CCompiler

    • Замените старый-mno-cygwin fix на

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

      Для gcc 4.9.2 -- Примечание для 5.4.0, никаких "если", просто

      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, кажется, работает лучше без msvcr90, поэтому вызовите get_msvcr условный:

              if self.gcc_version < '5':
                  self.dll_libraries = get_msvcr()
      
  2. Используйте a setup.py со следующим

    libdirs=['C:\\Python27\\libs',...]
    macros=[('MS_WIN64','1'),...]
    platform="WIN32"
    
  3. Исправьте один из моих заголовков исходного файла, чтобы включить

    #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
    

Некоторые из вышеперечисленного, возможно, не совсем в оптимальном месте, но это заставило мое расширение работать...

Comments

    Ничего не найдено.