Lorsque j'exécute ce qui suit à partir d'un shell bash sur mon Mac:
$ file /usr/bin/python
Je reçois les trois lignes suivantes:
/usr/bin/python (for architecture x86_64): Mach-O 64-bit executable x86_64
/usr/bin/python (for architecture i386): Mach-O executable i386
/usr/bin/python (for architecture ppc7400): Mach-O executable ppc
cela semblerait indiquer que Python a été compilé pour les trois architectures ou quelque chose comme ça? D'après certaines erreurs que j'ai rencontrées lors de la configuration de MySQL, je pense que la version que j'utilise est la version 64 bits. Donc deux questions:
Comment aurais-je su cela?
Comment pourrais-je changer Python pour être 32 bits à la place? Quelque chose de moins radical que de recompiler avec différents paramètres de compilation?
Pourquoi Arch
depuis un shell bash renvoie-t-il i386
, ce qui semble indiquer que je ne suis pas en "mode 64 bits" alors que je sais, en fonction de mon processeur, utiliser un Mac 64 bits?
Désolé, ce sont probablement toutes des questions pour les débutants. L’ensemble de la résolution 32/64 bits est frustrant pour moi et je suis sûr qu’il existe certaines commandes/outils qui faciliteraient cette tâche.
Vous pouvez en apprendre beaucoup sur la version Python que vous utilisez via le module platform
(le module sys
a aussi quelques simples aides)
Sur Mac OS X, vous pouvez exécuter un "fat binary" avec l’architecture de votre choix avec, par exemple,
Arch -i386/usr/bin/python
Je recommande pas de modifier/usr/lib/python lui-même (avec la commande lipo
) - vous pouvez facilement rendre votre système inutilisable en altérant les fichiers système. Peut-être que l’installation d’un Python distinct de python.org (à des fins d’application) tout en laissant le système seul est une stratégie acceptable pour vous - c’est bien plus sûr que de modifier les fichiers système!
Quant à votre troisième question, hmmm, celle-ci est un problème pour moi - et certainement une question pour superuser.com (ainsi que sans aucun lien avec Python, elle semble également totalement sans rapport avec la programmation ;-).
http://www.jaharmi.com/2009/08/29/python_32_bit_execution_on_snow_leopard
$ defaults write com.Apple.versioner.python Prefer-32-Bit -bool yes
Correction de l’utilisation de virtualenv sur Snow Leopard
la réponse de danielrsmith fonctionne pour moi lorsque je n'utilise pas virtualenv, mais virtualenv crée une copie de l'exécutable python, ce qui l'empêche de fonctionner:
$ which python
/Users/cogg/.virtualenvs/tweakeats/bin/python
$ python
[...]
>>> import sys
>>> sys.maxint
9223372036854775807
comme il s’agit d’une copie de python, j’ai utilisé lipo pour supprimer l’architecture 64 bits. Cela me permet d’utiliser python 2.6 32 bits avec virtualenv:
$ lipo -info /Users/cogg/.virtualenvs/tweakeats/bin/python
Architectures in the fat file: /Users/cogg/.virtualenvs/tweakeats/bin/python are: x86_64 i386 ppc7400
$ mv /Users/cogg/.virtualenvs/tweakeats/bin/python /Users/cogg/.virtualenvs/tweakeats/bin/python.old
$ lipo -remove x86_64 /Users/cogg/.virtualenvs/tweakeats/bin/python.old -output /Users/cogg/.virtualenvs/tweakeats/bin/python
$ python
[...]
>>> import sys
>>> sys.maxint
2147483647
La réponse a été acceptée. Mais je pense que la 3ème question est toujours sans réponse. J'ai trouvé la question intéressante, de même que certaines recherches. Voici la réponse que j'ai trouvée dans un autre forum SO -
SnowLeopard exécute des applications et des logiciels système 32 bits sur des ordinateurs Intel 32 bits, ainsi que des logiciels systèmes 64 bits et des applications 32 bits et 64 bits sur des ordinateurs Intel 64 bits. La version de bureau de Snow Leopard démarre un noyau 32 bits pour des raisons de compatibilité avec kext et avec les pilotes, mais tout l'espace utilisateur est exécuté en 64 bits. Mac OS X Server démarre dans un noyau 64 bits. Core 2 Duo est une machine 64 bits. Essayez $ sysctl hw.cpu64bit_capable ou sysctl hw.optional.x86_64 pour vérifier que vous avez un processeur 64 bits. Arch affichera toujours l'i386 sur du matériel Intel dans les modèles Leopard et Snow Leopard. - cdespinosa 22 sept. 09 à 4:23
Lien original - Compilateur Mac OSX 10.6: une expérience déroutante avec 32 vs 64 bits
la troisième question concerne le noyau 32/64 bits
le fait que vous disposiez d’un système d’exploitation 64 bits et d’un processeur 64 bits ne signifie pas que vous démarrez un noyau 64 bits sous Mac OSX
Si vous avez un Mac avec le léopard des neiges 10.6 par défaut, il est livré en mode 32 bits par défaut.
vous devez modifier les paramètres du système pour démarrer en mode 64 bits
(Je ne suis pas sûr que les modifications apportées à 10.7 ou 10.8 soient les dernières que j'utilise, c'est snow leo mais je pense qu'elles peuvent démarrer le noyau 64 bits par défaut
10.6 - depuis le terminal, lancez la commande:
:*Sudo nvram boot-args="Arch=x86_64"
OU
10.6 - depuis le terminal, lancez la commande:
Sudo defaults write /Library/Preferences/SystemConfiguration/com.Apple.Boot 'Kernel Flags' 'Arch=x86_64'
Après de nombreuses tentatives et erreurs en essayant certaines des suggestions ci-dessus, je suis tombé sur le lien symbolique suivant:
/usr/local/bin/python2-32
pointant vers:
/Library/Frameworks/Python.framework/Versions/2.7/bin/python2-32
Et j'observe que lorsque je lance ce Python, il démarre en mode 32 bits (contrairement à /Library/Frameworks/Python.framework/Versions/2.7/bin/python2
). Ceci peut être observé dans Activity Monitor.
Remarque: comme d'autres l'ont déjà souligné, platform.architecture()
n'est pas toujours un bon indicateur. Il affiche «64 bits» pour ce processus 32 bits.
J'ai essayé de nombreuses manières d'exécuter le script de test Skype4Py en utilisant,
Arch -i386
Au final, ce qui a fonctionné a été d'examiner le chemin d'accès au segfault de la version 64 bits revendiquée de python et de l'insérer dans mon fichier d'en-tête:. #!/Système/Bibliothèque/Frameworks/Python.framework/Versions/2.7/Ressources/Python.app/Contenu/MacOS/Python
Après avoir mis cette ligne en haut et ajouté des autorisations d'exécution à mon fichier, j'ai pu utiliser, Arch -i386 skype.py
Et cela fonctionnerait sans problème.