Компилятор Microsoft Visual C++ для Python 2.7

Я скачал компилятор Microsoft Visual C++ для Python 2.7 и установил его, полный путь vcvarsall.bat является:

C:\Users\UserName\AppData\Local\Programs\Common\Microsoft\Visual C++ for Python\9.0\vcvarsall.bat

Но следующий код не может вернуть его путь:

from distutils import msvc9compiler
msvc9compiler.find_vcvarsall(9.0)

Установщик записывает не информацию об установке в реестр, а из исходного кода find_vcvarsall()кажется, что он не может найти vcvarsall.bat файл из VS90COMNTOOLS настройки, потому что это требует, чтобы имя папки, содержащей vcvarsall.bat является VC:

productdir = os.path.join(toolsdir, os.pardir, os.pardir, "VC")

Как я могу использовать компилятор без изменения реестра или имени папки?

6 ответов

Решение

Обновите setuptools до 6.0 или выше. В этой версии setuptools может автоматически определять компилятор Microsoft Visual C++ для Python 2.7 с помощью vcvarsall.bat.

Пожалуйста, обратитесь к:

  1. https://pypi.python.org/pypi/setuptools/6.1#id4
  2. https://bitbucket.org/pypa/setuptools/issue/258

Посмотри в setup.py файл пакета, который вы пытаетесь установить. Если это более старый пакет, возможно, он импортирует distutils.core.setup() скорее, чем setuptools.setup(),

Я столкнулся с этим (в 2015 году) с сочетанием этих факторов:

  1. Компилятор Microsoft Visual C++ для Python 2.7 от http://aka.ms/vcpython27

  2. Более старый пакет, который использует distutils.core.setup()

  3. Пытаюсь сделать python setup.py build вместо того, чтобы использовать pip,

Если вы используете последнюю версию pip, она заставит (monkeypatch) пакет использовать setuptools, даже если его setup.py призывает к distutils. Однако, если вы не используете pip, а вместо этого просто делаете python setup.py build, процесс сборки будет использовать distutils.core.setup(), который не знает о месте установки компилятора.


Решение

Шаг 1. Откройте соответствующую командную строку Visual C++ 2008

Откройте меню "Пуск" или начальный экран и найдите "32-битная командная строка Visual C++ 2008" (если ваш Python 32-битный) или "64-битная командная строка Visual C++ 2008" (если ваш Python 64-битный), Запустить его. В командной строке должно быть написано Visual C++ 2008... в строке заголовка.

Шаг 2: Установите переменные среды

Установите эти переменные среды в командной строке, которую вы только что открыли.

SET DISTUTILS_USE_SDK=1
SET MSSdk=1

Ссылка http://bugs.python.org/issue23246

Шаг 3: Сборка и установка

cd к пакету, который вы хотите собрать, и запустить python setup.py build, затем python setup.py install, Если вы хотите установить в virtualenv, активируйте его перед сборкой.

Кристиан Лонг предлагает практическое решение. Но если вы не хотите каждый раз изменять его в "32-битной / 64-битной команде Visual C++ 2008", вы можете просто узнать местоположение "vcvarsall.bat", то есть "C:\Users\UserName\AppData". \Local\Programs\Common\Microsoft\Visual C++ для Python\9.0\vcvarsall.bat", а затем измените функцию find_vcvarsall(version) в Python27\Lib\distutils\msvc9compiler.py

как это:

def find_vcvarsall(version):
    productdir= "C:/Users/UserName/AppData/Local/Programs/Common/Microsoft/Visual C++ for Python/9.0"
    vcvarsall = os.path.join(productdir, "vcvarsall.bat")
    if os.path.isfile(vcvarsall):
        return vcvarsall
    else:
        return None

Просто, некрасиво, но полезно.

У меня была та же проблема с этим пакетом, кажется, что они не тестировали его с чистой установкой.

В конце я просто добавил ключ для создания COMPUTER\HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\9.0\Setup\VC Затем я добавил строковое значение с именем productdir со значением, установленным для моего пути к vcvarsall.bat, который был таким же, как ваш.

Обновите ваши setuptools в командной строке:

pip install --upgrade setuptools

Последние версии setuptools выше 6.0 должны автоматически определять компилятор Microsoft Visual C++ для Python 2.7.

Все, что вам нужно, это ссылка: https://www.microsoft.com/en-us/download/details.aspx?id=44266

нет необходимости обновлять или изменять переменные пути или что-либо еще.

Другие вопросы по тегам