2011-01-11 2 views
1

Ich habe eine ziemlich lange Setup, dann drei Fragen am Ende. Unter OS X enthält das System-Python-Framework drei ausführbaren Dateien (lassen Sie mich ihnen kurze Namen geben):Tracing miteinander verbundenen Python-Programmdateien auf OS X

> 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 und B $ sind eindeutig zu klein Python selbst zu sein.

> 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 

Trotz gleicher Größe und offenbar Wirkung, sind die ersten zwei verschiedene, zum Beispiel:

> cmp -lc $A $B 

Auch in/usr/bin, python2.6 ist ein symbolischer Link auf $ C, aber es ist auch:

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

Ich möchte herausfinden, wie diese verbunden sind; der Befehl which hilft nicht.

> 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 

Zusammenfassung: $ A lädt $ B gefolgt von $ C; $ B lädt $ C; $ D Lasten $ B, gefolgt von $ C

Also meine Fragen sind:

  1. Ist das irgendwo dokumentiert?
  2. Welche Rollen spielen diese?
  3. Am wichtigsten, welche Werkzeuge wären nützlich, solche Verbindungen zu verfolgen?
+0

Wie ist es wichtig? Welches Problem hast du? Ohne Kontext - etwas, das Sie nicht tun können - das scheint, als ob die Ergebnisse niemandem helfen, etwas zu tun. –

+0

@ S.Lott: Ich würde gerne verstehen, wie dieses Setup funktioniert. Selbst wenn Sie denken, dass das keine angemessene Frage ist, ist # 3 immer noch. Ich habe nm weggelassen, was zeigt, dass $ A und $ B nicht viel bewirken, aber Datei hilft nicht wirklich. Ich kann mit Antwort # 1 leben, aber ich hoffe auf spezifischere Tools. – telliott99

+0

spezifischere Werkzeuge, um was zu tun? - Unix ist eine Reihe von Tools, die zusammenarbeiten – Mark

Antwort

3

Die von Apple bereitgestellten Pythons suchen hätte X 10.6 sind gebaut und installiert die Standard-Python Rahmen Build-Option, mit ein paar Anpassungen an der Kundenanpassung. Es ist nicht in der Dokumentation von Apple, weil das spezifische Layout keine Erfindung von Apple ist; Es hat sich im Laufe der Jahre durch das Python-Projekt weiterentwickelt und andere OS X-Framework-Layouts als Ausgangspunkt verwendet. Wenn Sie eine Version von Python unter OS X mit einem der python.org-Installationsprogramme installieren, sagen wir von here, sehen Sie das gleiche Muster, wobei das Framework unter /Library/Frameworks/ statt /System/Library/Frameworks verwurzelt ist. Also, wenn Sie wirklich neugierig sind, können Sie die Quelle herunterladen und schauen Sie sich die configure Skript und Makefile Vorlagen. Es kann jedoch schwer lesbar sein. Apple stellt auch here die Quelle zur Verfügung, die verwendet wird, um Open-Source-Komponenten, einschließlich Python, in jeder OS X-Version zusammen mit den Anpassungspatches zu erstellen. Theoretisch können Sie also genau sehen, wie Apple gebaut hat, was es veröffentlicht hat.

Das heißt, Ihre Fragen zu beantworten, in Python 2.6:

$A ist die pythonw Wrapper, der Python sorgt dafür, als GUI-Anwendung von OS X erkannt (siehe die Quelle pythonw.chere). Beachten Sie, dass die Apple-Version von Pythonw angepasst wurde, um die bevorzugten Ausführungsmodi hinzuzufügen (siehe Apples man 1 python). Ein etwas anderer Ansatz ist in der Upstream-Quelle neuer Versionen von Python (2.7 und 3.2) zu finden.

$B ist die eigentliche ausführbare Datei des Python-Interpreters. Es ist, was ist exec ed von der Pythonw ausführbare Datei, $A. Sie sollten dies leicht überprüfen können, indem Sie Python tatsächlich ausführen und den Wert sys.executable betrachten, aber es gibt einen Fehler mit dem von Apple gelieferten Python 2.6 (wahrscheinlich aufgrund der oben erwähnten Funktion), der den falschen Wert verursacht es. Die python.org Python 2.6.6 zeigt den richtigen Wert:

$ 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 die gemeinsam genutzte Bibliothek ist alle der Dolmetscher ladbare Module enthält. Sie können sehen, dass durch otool auf $B mit:

$ 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) 
+0

Nochmals vielen Dank, Ned. – telliott99

+0

Aus irgendeinem Grund läuft $ B auf einem Lion-Rechner aus dem Python-Framework, das ich auf einem Mavericks-Rechner erstellt habe, ich bekomme das System Python (andere Version) ... Irgendeine Idee, was ist los? Du hast gesagt, das sollte das eigentliche Python-Binary sein ... – remram

+0

Remam, ohne weitere Informationen, kann man nur auf deine spezifische Situation raten. Wenn Sie es weiterverfolgen möchten, öffnen Sie bitte eine neue Frage mit allen relevanten Details zu dem, was Sie tun möchten. –

2

Die Tools zu verwenden sind ls und Datei.

ls -l gibt an, wohin der symbolische Link geht. Die Größe eines symbolischen Links ist die Anzahl der Chafrakter in dem Pfad, auf den er zeigt.

Datei x gibt den Typ der Datei

z.B.

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 Frameworks sind in Apple developer docs

/Library/Frameworks/Python.framework/Versions/2.6/Resources/Python.app/Contents/MacOS/Python und /System/Library/Frameworks/Python.framework/Versions/2.6/bin/python2.6 sind die eigentlichen Python-Interpreter, ich denke, sie sind harte Links zu derselben Binärdatei.

/usr/bin/python ist das Python auf dem Pfad - ich denke, es ist schwer mit/usr/bin/pythonw verbunden. Dies sind Wrapper, die in /System/Library/Frameworks/Python.framework/Versions/2.6/bin/python2.6 exec der realen Python-Interpreter nennen python bug tracker

/System/Library/Frameworks/Python.framework/Versions sehen/Current ist ein Symlink zu System/Library/Frameworks/Python.framework/Versions/2.6 unter Verwendung der OSX Framework Standardversion

/System/Library/Frameworks/Python.framework/Versions/2.6/Python ist die gemeinsame Bibliothek, die macht all die Arbeit - als eine Bibliothek eingerichtet, so dass Sie Programme in anderen Sprachen schreiben können, die einen Python-Interpreter einbetten können.

Für weitere Details sehen Sie Python docs aber ich vermute, dass Sie die in OS apple python mailing list