2 votes

Comment trouver l'exécutable Python utilisé par mon serveur ?

Je suis nouveau sous Linux.

Je gère un serveur (Linux - Apache - mod_wsgi - Django), où il y a plusieurs installations de Python. Le site fonctionne actuellement, mais je voudrais savoir quel exécutable de Python est utilisé pour le faire fonctionner. Je sais que ce n'est pas l'exécutable par défaut.

Par ailleurs, comment mod_wsgi sait-il quelle installation de Python utiliser ? Les .wsgi script n'a pas de ligne shebang.

6voto

Jason Points 8799

La ligne # ! n'est pas utilisée et ne devrait pas être placée dans un fichier WSGI script tel qu'utilisé par mod_wsgi.

Pour déterminer quelle version/installation de Python est utilisée, il y a deux éléments à prendre en compte.

La première, comme l'a souligné quelqu'un d'autre, consiste à déterminer la bibliothèque Python à laquelle mod_wsgi.so est lié. Sur la plupart des systèmes UNIX, cela se fait à l'aide de la commande 'ldd'.

ldd mod_wsgi.so

Exécutez ceci sur le mod_wsgi.so installé dans le répertoire des modules d'Apache qui est utilisé. Cela vous permettra de savoir avec certitude quelle version de mod_wsgi a été compilée.

Si vous ne voyez pas de référence à un fichier libpythonX.Y.so, c'est que votre mod_wsgi.so a été lié statiquement à la bibliothèque Python. Bien que cela fonctionne, tant que mod_python n'est pas également chargé dans le même Apache, c'est une très mauvaise idée de s'y fier car l'utilisation de la liaison statique de la bibliothèque Python entraîne un gonflement inutile de vos processus Apache en raison de la relocalisation du code d'exécution qui doit être effectuée lors du chargement de mod_wsgi.so avec la bibliothèque Python liée de manière statique.

Notez que la valeur de "sys.executable" lors de l'exécution sous mod_wsgi n'a aucune signification et ne peut pas être utilisée pour déterminer quelle version de Python a été utilisée. En effet, la ligne de commande Python n'est pas utilisée. Au lieu de cela, l'exécutable qui est exécuté est en fait Apache et sys.executable le reflétera très probablement. Ce n'est qu'après l'exécution d'Apache et le chargement de mod_wsgi.so que Python est initialisé à l'aide des API Python intégrées. De même, l'exécution de "which Python" n'aidera pas à déterminer exactement quelle installation de Python est utilisée.

La deuxième partie consiste à déterminer quelle installation de Python a été utilisée au moment de l'exécution. Pour ce faire, vous devez utiliser un programme WSGI hello world et le modifier pour récupérer la valeur de 'sys.prefix'. Cette valeur indique le répertoire racine dans lequel se trouve l'installation de Python. En fonction de la version de la bibliothèque partagée Python utilisée, vous saurez alors quel répertoire "lib/pythonX.Y" est utilisé dans ce répertoire racine. La version est importante car il peut y avoir plusieurs versions installées dans ce répertoire racine.

Notez que ce que vous obtenez pour 'sys.prefix' peut en fait être différent du répertoire racine comme vous le pensiez et peut être basé sur la dépendance de libpythonX.Y.so du fichier mod_wsgi.so. Cela est dû à la manière dont Python, lorsqu'il est initialisé, essaie de trouver son répertoire "lib".

Par exemple, si Python 2.6 est installé sous '/usr/local' et un autre sous '/usr', mais que vous avez compilé mod_wsgi sous '/usr/local', il se peut que 'sys.prefix' soit résolu en '/usr'. Cela s'explique par le fait que, par défaut, dans les systèmes intégrés, Python prend en compte la valeur de la variable d'environnement "PATH" pour obtenir un chemin de recherche permettant de trouver un exécutable "Python" comme point de départ pour le calcul du répertoire racine, même si cet exécutable "Python" n'a pas été utilisé pour lancer le processus.

Sous Apache, parce qu'il est généralement démarré en tant que "root", il n'aurait pas nécessairement "/usr/local/bin" dans votre "PATH" et trouverait donc probablement "/usr/bin/Python" à la place et utiliserait donc "/usr" pour "sys.prefix".

Dans ce dernier cas de figure où il trouve un répertoire racine différent de celui que vous souhaitez utiliser, vous pouvez utiliser la directive WSGIPythonHome dans la configuration d'Apache pour remplacer le préfixe 'sys.prefix' qui est automatiquement calculé.

Notez que vous NE POUVEZ PAS utiliser WSGIPythonHome pour faire référence à une version différente de Python, il doit faire référence à un répertoire racine contenant une installation de Python de la même version majeure/mineure. Si vous devez utiliser une version différente de Python, vous devez recompiler et réinstaller mod_wsgi de manière à ce qu'il soit compilé en fonction de la nouvelle version. La version/installation de Python à utiliser lors de la compilation peut être spécifiée à l'aide de l'option '--with-Python' de la configuration de mod_wsgi script lors de la construction.

Il existe d'autres moyens que d'utiliser la directive WSGIPythonHome pour modifier l'installation de Python utilisée, mais il est recommandé de s'en tenir à WSGIPythonHome.

3voto

Justin Points 3736

Mod_wsgi est lié à une version spécifique de Python.

www:~# ls -l /usr/lib/apache2/modules/mod_wsgi*
lrwxrwxrwx 1 root root     15 2009-07-27 12:35 /usr/lib/apache2/modules/mod_wsgi.so -> mod_wsgi.so-2.5
-rw-r--r-- 1 root root 129552 2008-08-23 14:06 /usr/lib/apache2/modules/mod_wsgi.so-2.4
-rw-r--r-- 1 root root 129552 2008-08-23 14:06 /usr/lib/apache2/modules/mod_wsgi.so-2.5

Vous pouvez également procéder comme suit

www:~# ldd /usr/lib/apache2/modules/mod_wsgi.so
    ...
    libpython2.5.so.1.0 => /usr/lib/libpython2.5.so.1.0 (0xb7de0000)
    ...

2voto

Margaret Points 1077
$ python
Python 2.6.4 (r264:75706, Dec  7 2009, 18:45:15) 
[GCC 4.4.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 
>>> 
>>> import sys
>>> 
>>> print sys.executable
/usr/bin/python

0voto

Brannon Points 12633

Dont Python

Cela devrait montrer le Python qui est récupéré par le Shell.

Vous devrez exécuter cette commande en tant qu'utilisateur apache pour que son $PATH soit défini, plutôt qu'en tant qu'utilisateur.

0voto

Todd Price Points 703

Vous pouvez accéder à sys.executable à l'intérieur du code Python pour savoir quel binaire de l'interpréteur est utilisé. Coder une page WSGI pour le faire.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X