Кажется, я нашел проблему.
Короче говоря, консольный сценарий pipX.Y
настроен на версию интерпретатора Python, использованного для построения колеса pip . вместо версии интерпретатора Python, использованной для его установки.
Например, возьмите любой pip установлен в любом Python, то есть , а не 3.8 (в моем случае это Python 3.6), и используйте его для загрузки pip
:
$ /path/to/pythonX.Y -m pip download pip
Это должно дать вам файл wheel , например pip-20.0.2-py2.py3-none-any.whl
, теперь распакуйте его:
$ /path/to/pythonX.Y -m zipfile -e pip-20.0.2-py2.py3-none-any.whl .
Теперь посмотрите на содержимое pip-20.0.2.dist-info/entry_points.txt
:
$ cat pip-20.0.2.dist-info/entry_points.txt
[console_scripts]
pip = pip._internal.cli.main:main
pip3 = pip._internal.cli.main:main
pip3.8 = pip._internal.cli.main:main
Итак, есть запись для консольного скрипта pip3.8
, хотя у меня есть Python 3.6. Это явно неправильно. И, например, если бы у меня действительно был скрипт pip3.8
, то этот файл был бы удален при удалении pip , связанного с Python 3.6, например, для его обновления.
root проблемы можно увидеть здесь, например:
entry_points={
"console_scripts": [
"pip=pip._internal:main",
"pip%s=pip._internal:main" % sys.version_info[:1],
"pip%s.%s=pip._internal:main" % sys.version_info[:2],
],
},
Эта строка pip%s.%s=pip._internal:main" % sys.version_info[:2]
получает на самом деле записано определенно при сборке колеса , и я предполагаю, что колесо , которое мы скачали ранее, было построено с Python 3.8 .
Эта ошибка (хотя бы частично) известна сопровождающим pip , и она не уверена, что это будет исправлено (вероятно, не стоит).
В любом случае, вместо этого всегда следует использовать явное /path/to/pythonX.Y -m pip
. Сценарии pip*
- это просто ярлыки, которые приведены здесь для удобства. Они несколько полезны из интерактивной командной строки, чтобы сохранить некоторые нажатия клавиш и иметь возможность работать быстрее. Но в файле, что угодно, от документации до shell сценариев или Dockerfiles , я считаю, что всегда следует использовать явные расширенные версии. Например, я всегда пишу rm --recursive
вместо rm -r
, et c.
Дополнительно в одном конкретном случае Python s pip, имеет смысл независимо от того, что: