Отслеживание взаимосвязанных исполняемых файлов Python на OS X - PullRequest
1 голос
/ 11 января 2011

У меня довольно длинная настройка, затем три вопроса в конце.В 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.1006 * Несмотря на одинаковый размер и, очевидно, эффект, первые два отличаются, например:

> 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. Какие роли они играют?1025 * Самое главное, какие инструменты были бы полезны для отслеживания таких подключений?

Ответы [ 2 ]

3 голосов
/ 11 января 2011

Поставляемые компанией Apple Pythons в OS X 10.6 создаются и устанавливаются с использованием стандартного варианта сборки Python framework с несколькими настройками настройки. Этого нет в документации Apple, потому что конкретный макет не является изобретением Apple; он развивался годами в рамках проекта Python, используя в качестве отправной точки другие макеты платформы OS X. Если вы устанавливаете версию Python на OS X с помощью одного из установщиков python.org, скажем, из здесь , вы увидите тот же шаблон с каркасом с корнем /Library/Frameworks/, а не /System/Library/Frameworks. Так что, если вы действительно любопытны, вы можете скачать исходный код и посмотреть на configure скрипт и Makefile шаблоны. Это может быть тяжелое чтение, хотя. Apple также делает доступным здесь исходный код, используемый для создания компонентов с открытым исходным кодом, включая Python, в каждом выпуске OS X вместе с патчами для настройки, так что теоретически вы можете точно увидеть, как Apple создала то, что выпустила.

Тем не менее, чтобы ответить на ваши вопросы, в Python 2.6:

$A - это оболочка pythonw, которая обеспечивает распознавание Python как приложения с графическим интерфейсом в OS X (см. Источник pythonw.c здесь ). Обратите внимание, что версия Pythonw для Apple была настроена для добавления предпочтительных режимов выполнения (см. Apple man 1 python). Несколько иной подход к этому представлен в исходном коде новых версий Python (2.7 и 3.2).

$B - фактический исполняемый файл интерпретатора Python. Это то, что exec редактируется исполняемым файлом pythonw, $A. Вы сможете легко проверить это, фактически запустив 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 - это разделяемая библиотека, содержащая все загружаемые модули интерпретатора. Это можно увидеть с помощью otool на $B:

$ 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)
2 голосов
/ 11 января 2011

Используемые инструменты: ls и file.

ls -l даст то, на что идет символическая ссылка.Размер символьной ссылки - это число символов в пути, на который он указывает.

файл 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 для разработчиков

/ Библиотека / Фреймворки / Python.framework / Версии / 2.6 / Ресурсы / Python.app / Содержание / MacOS / Python и / / Система / Библиотека / Фреймворки/Python.framework/Versions/2.6/bin/python2.6 - настоящий интерпретатор python, я думаю, что это жесткие ссылки на один и тот же двоичный файл.

/ usr / bin / python - это питон на пути -Я думаю, что это трудно связано с / usr / bin / pythonw.Это оболочки, которые вызывают exec для реального интерпретатора Python в /System/Library/Frameworks/Python.framework/Versions/2.6/bin/python2.6 см. Отслеживание ошибок Python

/ Система/Library/Frameworks/Python.framework/Versions/Current является символической ссылкой на System / Library / Frameworks / Python.framework / Versions / 2.6 с использованием стандартной версии OSX Framework

/ System / Library / Frameworks / Python.framework / Versions / 2.6 / Python - это разделяемая библиотека, которая выполняет всю работу - настроена как библиотека, чтобы вы могли писать программы на других языках, которые могут встраивать интерпретатор Python.

Другие подробности смотрите в Python docs , но я подозреваю, что вам придется искать в списке рассылки apple python

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...