Почему 2 разных исполняемых файла python одной версии? - PullRequest
3 голосов
/ 02 августа 2020

Когда я нажимаю tab в команде python3.7, я получаю следующее

python3.7          python3.7-config   python3.7m         python3.7m-config

Я посмотрел, что python3.7m, и нашел ответ - { ссылка }.

Далее I go к терминалу python каждой реализации и набираю следующий код

>>> import sysconfig
>>> sysconfig.get_config_var('EXT_SUFFIX')

Я получаю одинаковый результат в обеих реализациях python, т.е. .cpython-37m-darwin.so

Я также попробовал команду diff <(python3.7 -m sysconfig) <(python3.7m -m sysconfig), чтобы увидеть, есть ли разница в информации о конфигурации 2 исполняемых файлов, но вывод пустой означает, что они одинаковы.

Если все исполняемые файлы и переменные конфигурации одинаковы, тогда зачем создавать две разные реализации python?

Примечание:

Я не говорю здесь о python3.7/3.7m-config.

1 Ответ

1 голос
/ 03 августа 2020

python3.7 и python3.7m - это одна и та же программа, только с двумя разными именами. Эти два файла имеют жесткую связь , что означает, что они указывают на один и тот же файл на диске (т. Е. Имеют один и тот же индексный дескриптор).

Вот строка в cpython 3,7 Makefile, который выполняет эту жесткую ссылку.

(cd $(DESTDIR)$(BINDIR); $(LN) python$(LDVERSION)$(EXE) python$(VERSION)$(EXE));

$(LDVERSION) будет 3.7m, а $(VERSION) будет 3.7. Это единственное место в Makefile, которое выполняет жесткую ссылку.

Изображение python3 .7 Docker используется ниже, чтобы продемонстрировать, что python3.7 и python3.7 имеют одинаковый индексный дескриптор.

$ docker run --rm -it python:3.7-alpine ash
/ # ls -i $(which python3.7)
 927902 /usr/local/bin/python3.7
/ # ls -i $(which python3.7m)
 927902 /usr/local/bin/python3.7m
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...