Почему две уникальные копии Python 3.7.0 установлены в Windows в совершенно разных местах?

У меня установлен Python 3.7.0 в Windows. Я только один раз следил за установщиком, но у меня есть два разных исполняемых файла python, установленных в двух разных местах.

C:\Windows\py.exe

с белым значком — 887 КБ (908 952 байта); а также

C:\Users\myuser\AppData\Local\Programs\Python\Python37\python.exe

с черным значком, 97,6 КБ (99 992 байта)

Установщик Python указывает второй путь, как показано в руководстве, но Git Bash, Cygwin и MSYS+MingW сообщают о первом как о действительном, а не о втором:

$ which python
which: python: unknown command

$ which py
/c/WINDOWS/py.exe

И PowerShell показывает, что оба они являются Python 3.7.0, несмотря на разные размеры файлов:

PS C:\Users\myuser\AppData\Local\Programs\Python\Python37> ./python.exe -V
Python 3.7.0

PS C:\Users\myuser\AppData\Local\Programs\Python\Python37> py -V
Python 3.7.0

В первом пути нет подпапки «Scripts», а во втором есть, однако переменные System Environment указывают на папку «Scripts» на пути, который не имеет папки «Scripts»:

Переменная PATH: %PYTHON_HOME%\ %PYTHON_HOME%\Scripts\

Переменная PYTHON_HOME: C:\Windows\

Так где же «py.exe» хранит библиотеки? Почему они оба правильно запускают скрипты Python и имеют одинаковые результаты? И почему вообще есть установка на C:\Windows\? Мне пришлось физически добавить вторую в переменную PATH, чтобы иметь возможность использовать pip из терминала, не набирая py -m pip, и я не хочу вводить длинную версию.


person Ryan    schedule 21.09.2018    source источник


Ответы (2)


py.exe – это специальная программа запуска Python для Windows. . Он не связан напрямую с какой-либо конкретной версией Python, он просто устанавливается с любой версией Python 3.3 или более поздней версии и обеспечивает три основных преимущества:

  1. Установка в каталоге Windows гарантирует, что он всегда будет установлен в вашем PATH (поэтому нет необходимости изменять ваш PATH для каждого каталога установки Python).
  2. Это позволяет вам легко выбирать разные версии Python; py -2 myscript.py запускает его с последней версией Python 2 в вашей системе, py -3 myscript.py с последней версией Python 3 или py -3.5 myscript.py можно использовать для запуска с Python 3.5, даже если доступна более поздняя версия. Начиная с лаунчера 3.6, без аргументов он запускает последнюю версию Python, которую вы установили; для программы запуска 3.3-3.5 по умолчанию используется последняя установленная версия Python 2 с переключателем -3, необходимым для использования последней версии Python 3.
  3. Связав программу запуска с расширением .py, вы можете использовать строки shebang в стиле UNIX в своих скриптах. Например, если первая строка вашего скрипта #!/usr/bin/env python3 (довольно стандартная), а py.exe установлена ​​и связана с .py файлами, то при запуске myscript.py это эквивалентно запуску py -3 myscript.py

Вы можете прочитать дополнительную информацию о PEP.

Дело в том, что py.exe на самом деле не хранит никаких собственных библиотек. Все, что он делает, — это предоставляет общий интерфейс для поиска других существующих установок Python в Windows (хотя он поставляется только с 3.3 и выше, он также управляет более старыми установками, включая установки Python 2). К сожалению, pip приходится запускать уродливым образом, но это в основном неизбежно, если вы хотите, чтобы несколько версий Python существовали в системе, не наступая друг на друга. Если бы вы установили и 2.7, и 3.7, только один из них мог бы быть первым в вашем PATH, поэтому вам нужно было бы запустить только один python.exe и один pip; используя пусковую установку py.exe с py -2 -mpip или py -3 -mpip, вы можете быть точны, не наступая друг другу на пятки.

person ShadowRanger    schedule 21.09.2018
comment
Это объясняет, почему два исполняемых файла имеют разные размеры. Спасибо. Я полагаю, что стоит указать длинный путь к сценариям в переменной PATH, чтобы использовать pip, поскольку я использую только одну версию Python. Но зачем им включать папку %%\Scripts в PATH, если ОС не может получить к ней действительный доступ? Используется ли он внутри Python? - person Ryan; 22.09.2018
comment
Лаунчер устанавливается в каталог Windows (не System32) только при установке для всех пользователей. В противном случае он устанавливается в подкаталог %LocalAppData%\Programs\Python, который автоматически добавляется в файл PATH для каждого пользователя. У установщика также есть возможность обновить PATH, чтобы включить каталоги установки и скриптов, а также добавить .PY в PATHEXT. Что касается pip, если каталог Scripts находится в PATH, вы можете использовать имя версии, такое как pip3.6, для устранения неоднозначности. Единственный раз, когда необходимо использовать -m pip, это при обновлении самого pip. - person Eryk Sun; 22.09.2018

Не могли бы вы запустить обе версии Python с помощью этих команд в обоих случаях:

import sys
print('\n'.join(sys.path))

Результаты представляют собой путь к библиотекам по умолчанию для соответствующей копии Python.

Анаконда не использует PYTHONPATH. В стандартной документации Python предлагается не настраивать эту переменную среды, так как разные версии Python могут есть совместимые библиотеки. Итак, я бы не стал ничего делать, если у вас не закончилось место на диске. Один из Python должен быть установлен cygwin, а другой — стандартным установщиком Python.

person yoonghm    schedule 21.09.2018
comment
Это было мое первое предположение, но кажется, что ответ @ShadowRanger объясняет разницу в размерах файлов, а также другие элементы, тогда как этот ответ должен быть верным только в том случае, если оба исполняемых файла имеют одинаковый размер. - person Ryan; 22.09.2018