2010-07-28 5 views
0

Essentiellement, je suis à la recherche d'un moyen de trouver ce qui suit, mais à partir de Python sans avoir à exécuter des commandes système:Trouver les architectures que Python a été construit pour, mais à partir de Python lui-même

$ file `which python2.7` 
/Library/.../2.7/bin/python2.7: Mach-O universal binary with 2 architectures 
/Library/.../2.7/bin/python2.7 (for architecture i386): Mach-O executable i386 
/Library/.../2.7/bin/python2.7 (for architecture x86_64): Mach-O 64-bit executable x86_64 

Quelque chose comme:

>>> get_mac_python_archs() 
['i386', 'x86_64'] 
>>> 

Possible?

+0

Quel est le problème avec l'utilisation des commandes système comme fichier ou otool? Avant de demander à quelqu'un de trouver comment faire cela, il serait poli d'expliquer pourquoi vous ne pouvez pas le faire en toute simplicité, ne serait-ce que pour nous convaincre que vous ne pouvez vraiment pas le faire facilement. – user57368

+0

@ user57368: tant mieux si cette information est intégrée dans la librairie Python, sinon je devrai lancer un nouveau processus ("lipo" ou "fichier") qui ajouterait au démarrage de mon programme ... bien que ne semble pas être un retard significatif. –

+0

duplicata possible de [Comment puis-je déterminer si mon shell python s'exécute en mode 32 bits ou 64 bits?] (Http://stackoverflow.com/questions/1405913/how-do-i-determine-if-my-python-shell -is-exécution en mode 32 bits ou 64 bits) – outis

Répondre

0

La fonction platform.architecture retourne juste le travail de la plate-forme:

Python 2.6.5 (r265:79359, Mar 24 2010, 01:32:55) 
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import platform 
>>> platform.machine() 
'i386' 

le plus proche que je peux arriver à est à l'aide distutils.util.get_platform:

>>> import distutils.util 
>>> distutils.util.get_platform() 
'macosx-10.3-fat' 

qui est la réponse complète si vous utilisez Python 2.7/3.2, comme vous pouvez le voir dans la documentation. "A partir de Python 2.7 et Python 3.2 l'architecture fat3 est utilisée pour une construction universelle à 3 voies (ppc, i386, x86_64) et intel est utilisée pour une construction univeral avec les architectures i386 et x86_64"

1

Pour autant que je sachez qu'il n'y a pas d'autre moyen vraiment fiable que d'examiner les fichiers exécutables eux-mêmes pour voir quelles architectures ont été combinées, c'est-à-dire ce que fait file. Alors que le distutils.util.get_platform() noté ailleurs est probablement le plus proche, il est basé sur les informations de configuration au moment de la construction Python et les critères utilisés ont changé entre les versions et même entre les distributions de la même version.

Par exemple, si vous avez construit un Python 2.6 sur OS X 10.6 avec l'option universelle 4 voies (ppc, ppc64, i386, x86_64), get_platform() devrait signaler macosx-10.6-universal. Toutefois, le Python 2.6 fourni par Apple dans OS X 10.6 signale la même chaîne même s'il s'agit seulement d'une compilation à trois voies (no ppc64). EDIT: Ce n'est peut-être pas le meilleur exemple car, à bien y penser, vous ne pourriez probablement pas construire une variante ppc64 avec le SDK 10.6. Cependant, le point maintient toujours que la chaîne de la plateforme dépend trop du contexte pour être totalement fiable. Il peut être assez fiable pour certains besoins, cependant. Sinon, appeler à file ou otool etc. est probablement la meilleure façon de faire.

Questions connexes