当我在命令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
与C扩展的二进制兼容性
为了使C扩展能够跨解释器构建兼容,一些构建时标志需要相同。其中一个标志是是否启用了
pymalloc
(一个针对特定于Python的用例的内存分配库)。libpython的版本有一个m
后缀,表示这个标志在构建时存在,而实际上它是存在的如果C扩展是使用pymalloc支持构建的,那么它不能被使用标准C库的
malloc()
的解释器使用,反之亦然。因此,对于将C扩展作为使用pymalloc
构建的预构建二进制文件的人来说,能够启动一个已知为自身启用了pymalloc
的Python解释器是非常有用的如果Linux发行版选择仅提供支持pymalloc的解释器,那么在
python3.7
和python3.7m
名称下只有一个二进制文件是有意义的。(这使得需要非pymalloc解释器的人有点运气不佳,但在Linux上获得构建工具不像在Windows上那么困难,因此ABI兼容性没有那么重要)python3.7
和python3.7m
是同一个程序,只是有两个不同的名称。这两个文件是hard-linked,这意味着它们指向磁盘上的同一个文件(即,它们具有相同的inode)下面是执行此硬链接的the line in the cpython 3.7 ^{}
$(LDVERSION)
将是3.7m
,而$(VERSION)
将是3.7
。这是Makefile中执行硬链接的唯一位置下面使用python3.7docker图像来演示
python3.7
和python3.7
具有相同的inode相关问题 更多 >
编程相关推荐