Компиляция модулей 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)
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. Вам нужно будет
- создайте файл конфигурации distutils для указания компилятора mingw ,
- удалите ошибку-mno-cygwin из distutils.cygwinccompiler.Mingw32ccompiler и
- экспортируйте файл определений библиотек, используя либо
pexports.exeиз msys, либоgendef.exeиз msys2 и создайте статическую библиотекуlibpython27.a, используяdlltool.exe(msys/msys2) (но самые новые версии официальных Python для Windows уже есть этот файл в папкеPython27\lib, спасибо!) .Однако в конце концов вам все равно нужно будет связать со средой выполнения, с которой был построен 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, следуя инструкциям, которые размещены в различных местах через справочную документацию и Вики:
- из меню пуск выберите Все программы затем Microsoft Windows SDK v7.0 и запустите CMD Shell, чтобы открыть окно команд, оптимизированное для Windows SDK.
Шаг #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 не установлены, и т. д.Затем введите
setenv /Release /x64, который установит переменные среды SDK специально для выпуска Windows 7 x64 (vs debug или x86, которые используются по умолчанию).- тип
set DISTUTILS_USE_SDK=1возврат хита и затем введитеset MSSdk=1и вернитесь, чтобы сообщитьdistutils.msvccompiler, что вы используете SDK, и что SDK определит все переменные среды.- теперь используйте выбранный вами метод установки:
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). Вот как его использовать:
Перейти к http://aka.ms/vcpython27 , загрузите и установите пакет (он довольно мал и не требует прав администратора)
Обновите setuptools до версии 6.0 или более поздней (
pip install -U setuptools)Установите свой пакет (
pip install <whatever>)В сочетание последней версии setuptools и этого пакета компиляторов должно сделать это очень легко.
Очевидно, есть несколько способов сделать это.
- сборка с использованием mingw
- Сборка python 2.7 с использованием VS 2008 express.
- я не уверен относительно того, какая версия хороша для сборки 3.2, но это может быть VS 2010.
- Вы можете скомпилировать python x64 из исходного кода, используя желаемый VS, но у вас будут проблемы с совместимостью с другими предварительно построенными пакетами.
Это сработало лучше всего для меня:
- установить
Visual Studio Express 2008- установить
Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 SP1из http://www.microsoft.com/en-us/download/details.aspx?id=3138- перейдите в
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\binи откройтеVisual Studio 2008 x64 Win64 Command Prompt- в этой оболочке бегите
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:
Редактировать 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()Используйте a setup.py со следующим
libdirs=['C:\\Python27\\libs',...] macros=[('MS_WIN64','1'),...] platform="WIN32"Исправьте один из моих заголовков исходного файла, чтобы включить
#ifdef MS_WIN64 #define strdup _strdup #endifНаконец,
/c/Python27/python [editted setup].py -v build --compiler=mingw32 /c/Python27/python [editted setup].py -v installНекоторые из вышеперечисленного, возможно, не совсем в оптимальном месте, но это заставило мое расширение работать...
Comments