同一版本的python的“为什么”2个不同的可执行文件?

2024-04-27 01:01:55 发布

您现在位置:Python中文网/ 问答频道 /正文

当我在命令python3.7上按tab时,我得到以下结果

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

我查了一下什么python3.7m,找到了答案-https://stackoverflow.com/a/16677339/6849682

接下来,我转到每个实现的python终端并键入以下代码

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

我在两种python实现中得到相同的输出,即.cpython-37m-darwin.so

我还尝试了命令diff <(python3.7 -m sysconfig) <(python3.7m -m sysconfig),以查看这两个可执行文件的配置信息是否有任何差异,但输出为空意味着它们是相同的

如果所有的可执行文件和配置变量都相同,那么为什么要创建两个不同的python实现呢

注意:

我这里不是说python3.7/3.7m-config


Tags: 答案代码httpsimport命令comconfig终端
2条回答

与C扩展的二进制兼容性

为了使C扩展能够跨解释器构建兼容,一些构建时标志需要相同。其中一个标志是是否启用了pymalloc(一个针对特定于Python的用例的内存分配库)。libpython的版本有一个m后缀,表示这个标志在构建时存在,而实际上它是存在的

如果C扩展是使用pymalloc支持构建的,那么它不能被使用标准C库的malloc()的解释器使用,反之亦然。因此,对于将C扩展作为使用pymalloc构建的预构建二进制文件的人来说,能够启动一个已知为自身启用了pymalloc的Python解释器是非常有用的

如果Linux发行版选择提供支持pymalloc的解释器,那么在python3.7python3.7m名称下只有一个二进制文件是有意义的。(这使得需要非pymalloc解释器的人有点运气不佳,但在Linux上获得构建工具不像在Windows上那么困难,因此ABI兼容性没有那么重要)

python3.7python3.7m是同一个程序,只是有两个不同的名称。这两个文件是hard-linked,这意味着它们指向磁盘上的同一个文件(即,它们具有相同的inode)

下面是执行此硬链接的the line in the cpython 3.7 ^{}

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

$(LDVERSION)将是3.7m,而$(VERSION)将是3.7。这是Makefile中执行硬链接的唯一位置


下面使用python3.7docker图像来演示python3.7python3.7具有相同的inode

$ 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

相关问题 更多 >