【问题标题】:Tracing interconnected Python executables on OS X在 OS X 上跟踪互连的 Python 可执行文件
【发布时间】:2011-06-07 04:17:29
【问题描述】:

我有一个相当长的设置,最后是三个问题。 在 OS X 上,System Python 框架包含三个可执行文件(让我给它们简称):

> F=/System/Library/Frameworks/Python.framework/Versions/2.6
> A=$F/bin/python2.6
> B=$F/Resources/Python.app/Contents/MacOS/Python
> C=$F/Python

$A 和 $B 显然太小而不能成为 Python 本身。

> ls -s $A; ls -s $B; ls -s $C
16 /System/Library/Frameworks/Python.framework/Versions/2.6/bin/python2.6
16 /System/Library/Frameworks/Python.framework/Versions/2.6/Resources/Python.app/Contents/MacOS/Python
3152 /System/Library/Frameworks/Python.framework/Versions/2.6/Python

> $A
Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49) 
> $B
Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49) 
> $C
-bash: /System/Library/Frameworks/Python.framework/Versions/2.6/Python: cannot execute binary file

尽管大小和效果相同,但前两个是不同的,例如:

> cmp -lc $A $B

另外,在 /usr/bin 中,python2.6 是指向 $C 的符号链接,但也有:

> D=/usr/bin/python
> ls -s $D
48 /usr/bin/python

我想弄清楚这些是如何连接的;命令which 没有帮助。

> export DYLD_PRINT_LIBRARIES=1
> $A
..
dyld: loaded: /System/Library/Frameworks/Python.framework/Versions/2.6/Resources/Python.app/Contents/MacOS/Python
dyld: loaded: /System/Library/Frameworks/Python.framework/Versions/2.6/Python

总结:$A 加载 $B 后跟 $C; $B 加载 $C; $D 加载 $B 后跟 $C

所以我的问题是:

  1. 这是否记录在任何地方?
  2. 这些扮演什么角色?
  3. 最重要的是,哪些工具可用于跟踪此类连接?

【问题讨论】:

  • 这有什么关系?你有什么问题?没有上下文——你不能做的事情——这似乎对任何人都没有帮助。
  • @S.Lott:我想了解这个设置是如何工作的。即使您认为这不是一个合适的问题,#3 仍然是。我省略了 nm,这有助于表明 $A 和 $B 没有多大作用,但 file 根本没有真正的帮助。我可以接受答案 #1,但我希望有更具体的工具。
  • 更具体的工具做什么? - Unix是一组相互协作的工具

标签: python macos frameworks


【解决方案1】:

OS X 10.6 中 Apple 提供的 Python 是使用标准 Python framework 构建选项构建和安装的,并进行了一些自定义调整。它不在 Apple 的文档中,因为具体的布局不是 Apple 的发明;多年来,Python 项目使用其他 OS X 框架布局作为起点来发展它。如果您使用 python.org 安装程序之一在 OS X 上安装 Python 版本,例如从 here,您将看到相同的模式,框架植根于 /Library/Frameworks/ 而不是 /System/Library/Frameworks。所以,如果你真的很好奇,可以下载源代码并查看configure 脚本和Makefile 模板。不过,这可能是繁重的阅读。 Apple 还在每个 OS X 版本中提供 here 用于构建开源组件(包括 Python)的源代码以及自定义补丁,因此,理论上,您可以准确了解 Apple 是如何构建它发布的内容的。

也就是说,为了解决您的问题,在 Python 2.6 中:

$A 是 pythonw 包装器,可确保 Python 被 OS X 识别为 GUI 应用程序(请参阅 pythonw.c here 的源代码)。请注意,Apple 版本的 pythonw 已被定制以添加首选执行模式(请参阅 Apple 的 man 1 python)。较新版本的 Python(2.7 和 3.2)的上游源代码提供了一种稍微不同的方法。

$B 是 Python 解释器的实际可执行文件。这是由 pythonw 可执行文件$A 编辑的exec。您应该能够通过实际运行 Python 并查看 sys.executable 的值轻松验证这一点,但 Apple 提供的 Python 2.6 存在一个错误(可能是由于上述添加的功能),导致错误的值是分配给它。 python.org Python 2.6.6 显示正确的值:

$ cd /Library/Frameworks/Python.framework/Versions/2.6
$ ./bin/python2.6 -c 'import sys;print(sys.executable)'
/Library/Frameworks/Python.framework/Versions/2.6/Resources/Python.app/Contents/MacOS/Python`

$C 是包含所有解释器可加载模块的共享库。你可以通过在$B 上使用otool 看到这一点:

$ cd /System/Library/Frameworks/Python.framework/Versions/2.6
$ cd Resources/Python.app/Contents/MacOS/
$ otool -L ./Python
Python:
   /System/Library/Frameworks/Python.framework/Versions/2.6/Python (compatibility version 2.6.0, current version 2.6.1)
   /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.0)

【讨论】:

  • 出于某种原因,从我在 Mavericks 机器上构建的 Python 框架在 Lion 机器上运行 $B,我得到了系统 Python(不同版本)......知道发生了什么吗?你说那应该是真正的 Python 二进制文件...
  • remram,没有更多信息,只能猜测您的具体情况。如果您想继续,请打开一个新问题,其中包含您正在尝试做的所有相关细节。
【解决方案2】:

使用的工具是 ls 和 file。

ls -l 将给出符号链接的目标。符号链接的大小是它指向的路径中的字符数。

file x 将给出文件的类型

例如

file /System/Library/Frameworks/Python.framework/Versions/2.6/Python  
/System/Library/Frameworks/Python.framework/Versions/2.6/Python: Mach-O universal binary with 3 architectures  
/System/Library/Frameworks/Python.framework/Versions/2.6/Python (for architecture x86_64):      Mach-O 64-bit dynamically linked shared library x86_64  
/System/Library/Frameworks/Python.framework/Versions/2.6/Python (for architecture i386):        Mach-O dynamically linked shared library i386  
/System/Library/Frameworks/Python.framework/Versions/2.6/Python (for architecture ppc7400):     Mach-O dynamically linked shared library ppc  

OSX 框架在Apple developer docs 中描述

/Library/Frameworks/Python.framework/Versions/2.6/Resources/Python.app/Contents/MacOS/Python 和 /System/Library/Frameworks/Python.framework/Versions/2.6/bin/python2.6 是真正的python解释器,我认为它们是指向同一个二进制文件的硬链接。

/usr/bin/python 是路径上的 python - 我认为它与 /usr/bin/pythonw 硬链接。这些是调用 exec 到 /System/Library/Frameworks/Python.framework/Versions/2.6/bin/python2.6 中真正的 python 解释器的包装器,请参阅python bug tracker

/System/Library/Frameworks/Python.framework/Versions/Current 是使用标准 OSX 框架版本控制的 System/Library/Frameworks/Python.framework/Versions/2.6 的符号链接

/System/Library/Frameworks/Python.framework/Versions/2.6/Python 是完成所有工作的共享库 - 设置为库,以便您可以使用其他语言编写可以嵌入 Python 解释器的程序。

有关其他详细信息,请查看Python docs,但我怀疑您必须搜索apple python mailing list

【讨论】:

    猜你喜欢
    • 2023-04-06
    • 2013-04-26
    • 1970-01-01
    • 2016-12-19
    • 2016-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多