Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 19/01/2008, à 17:31

go2null

python : fonction linux/win32 récup. rép. d'install. de python

Bonjour,

Je suis débutant en python, mon souhait est de créer des applications python 100% compatibles Linux/Win32.

Je bute sur la création d'une fonction qui me permettrait de déterminer de manière 100% fiable le répertoire d'installation de python pour pouvoir déterminer l'emplacement du répertoire site-packages.

L'objectif final étant de vérifier si des extensions sont présentes ou non et éventuellement d'automatiser l'installation de celles dont mes applications auront besoin.

J'ai bricolé du cà´té de sys.executable et sys.path, mais je ne suis pas sûr de pouvoir récupérer à  100% ce qui m'intéresse en fonction des versions et des plateformes.

Merci de m'aider car google ne m'a pas trop aidé sur ce coup...
A+

#2 Le 19/01/2008, à 18:47

Clop'

Re : python : fonction linux/win32 récup. rép. d'install. de python

Bonjour,

J'ai jeté un oeil sur ton problème et il y a peut-être une piste à  creuser du cà´té de os.environ.

Il s'agit d'un dictionnaire représentant des vraiables d'environnement comme le nom de l'utilisateur, le répertoire perso, etc....

Avec un :

import os
print os.environ

tu pourras regarder ce qu'il y a dedans, chez moi, sous linux, j'ai '/usr/bin/python' à  la clé '_'. Faudra vérifier ce que ca donne sous win32, mais ça a l'air pas mal wink


----------------------
Linux on the Root , un site qu'il fait bon feuilleter!
----------------------
PyQtRadio, un lecteur de webradio simple et léger! Installation multi-distrib'

Hors ligne

#3 Le 19/01/2008, à 22:08

go2nul

Re : python : fonction linux/win32 récup. rép. d'install. de python

Salut Clop,

Merci d'avoir jeté un oeil, mais os.environ récupère les variables d'environnement du système (Linux ou Win32) et par défaut il n'y a généralement pas ce qui m'intéresse dedans...

Voilà  ce que ça me donne sur mon Gutsy :

/usr/bin/python -u  "/home/utilisateur/detect_install_dir2.py"
{'GNOME_DESKTOP_SESSION_ID': 'Default', 'LOGNAME': 'utilisateur', 'USER': 'utilisateur', 'HOME': '/home/utilisateur', 'PATH': '/home/utilisateur/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games', 'DISPLAY': ':0.0', 'SSH_AGENT_PID': '7643', 'LANG': 'fr_FR.UTF-8', 'SHELL': '/bin/bash', 'XDG_SESSION_COOKIE': '52ca2dfc0c4dc110c6883e0046741200-1200729628.492484-320359136', 'SESSION_MANAGER': 'local/pc:/tmp/.ICE-unix/7600', 'XDG_DATA_DIRS': '/usr/local/share/:/usr/share/:/usr/share/gdm/', 'WINDOWPATH': '7', 'USERNAME': 'utilisateur', 'GDM_XSERVER_LOCATION': 'local', 'SSH_AUTH_SOCK': '/tmp/ssh-nYBjyT7600/agent.7600', 'GNOME_KEYRING_SOCKET': '/tmp/keyring-zXU6MU/socket', 'GDMSESSION': 'default', 'DBUS_SESSION_BUS_ADDRESS': 'unix:abstract=/tmp/dbus-1DNEkjXMFe,guid=e00248b8d0a5d8ad4f93f0004791ae20', 'XAUTHORITY': '/home/utilisateur/.Xauthority', 'G_FILENAME_ENCODING': 'UTF-8', 'DESKTOP_SESSION': 'default', 'GDM_LANG': 'fr_FR.UTF-8', 'PWD': '/home/utilisateur', 'GTK_RC_FILES': '/etc/gtk/gtkrc:/home/utilisateur/.gtkrc-1.2-gnome2'}

Rien d'intéressant là -dedans.
Dommage.

Une autre idée ?

#4 Le 20/01/2008, à 11:47

trucutu

Re : python : fonction linux/win32 récup. rép. d'install. de python

Au pif :

Y a t-il une valeur de retour à  "import" ?
Si oui, pourquoi pas tester cette valeur pour voir si le plugin python est installé ou non


La chanson du dimanche - "La pêche !"
PC acheté chez Novatux : entièrement satisfait.
Faire des recherches solidaires !

Hors ligne

#5 Le 20/01/2008, à 13:22

go2null

Re : python : fonction linux/win32 récup. rép. d'install. de python

Salut trucutu,

Merci ton idée est intéressante pour savoir si une extension est installée ou non ; mais pour différentes raisons, j'ai quand même besoin de détecter les emplacements exacts ou sont installés les librairies Python et le répertoire site-packages quelles que soient la plateforme ou la version de Python.

Sous Gutsy voici ce que j'obtiens en faisant un print sys.path :
/usr/bin/python -u  "/home/eproust/detect_install_dir2.py"
['/home/eproust', '/usr/lib/python25.zip', '/usr/lib/python2.5', '/usr/lib/python2.5/plat-linux2', '/usr/lib/python2.5/lib-tk', '/usr/lib/python2.5/lib-dynload', '/usr/local/lib/python2.5/site-packages', '/usr/lib/python2.5/site-packages', '/usr/lib/python2.5/site-packages/Numeric', '/usr/lib/python2.5/site-packages/PIL', '/usr/lib/python2.5/site-packages/gst-0.10', '/var/lib/python-support/python2.5', '/usr/lib/python2.5/site-packages/gtk-2.0', '/var/lib/python-support/python2.5/gtk-2.0', '/usr/lib/python2.5/site-packages/wx-2.8-gtk2-unicode']


Sous XP voici ce que j'obtiens en faisant un print sys.path :

['', 'C:\\WINDOWS\\system32\\python25.zip', 'C:\\Python25\\DLLs', 'C:\\Python25\\lib', 'C:\\Python25\\lib\\plat-win', 'C:\\Python25\\lib\\lib-tk', 'C:\\Python25\\Lib\\site-packages\\pythonwin', 'C:\\Python25', 'C:\\Python25\\lib\\site-packages', 'C:\\Python25\\lib\\site-packages\\win32', 'C:\\Python25\\lib\\site-packages\\win32\\lib']

Ce qui m'intéresse là - dedans :
Sous Gutsy c'est : /usr/lib/python2.5 et /usr/lib/python2.5/site-packages
Sous XP c'est : C:\\Python25 et C:\\Python25\\lib\\site-packages

Je n'ai aucune certitude que je trouverais toujours en même position dans le sys.path les informations qui m'intéressent et c'est bien ce qui motive mon appel à  l'aide à  des programmeurs plus chevronnés.

#6 Le 20/01/2008, à 13:47

Clop'

Re : python : fonction linux/win32 récup. rép. d'install. de python

Encore une idée en l'air!

-> Utiliser sys.exec_prefix

Doc a écrit :

exec_prefix
    A string giving the site-specific directory prefix where the platform-dependent Python files are installed; by default, this is also '/usr/local'. This can be set at build time with the --exec-prefix argument to the configure script. Specifically, all configuration files (e.g. the pyconfig.h header file) are installed in the directory exec_prefix + '/lib/pythonversion/config', and shared library modules are installed in exec_prefix + '/lib/pythonversion/lib-dynload', where version is equal to version[:3].

Aucune idée de ce que ça donne sous un XP, mais à  priori la structure interne des répertoires python est toujours respecté ( la partie /lib/python2.5 ou \\lib\\site-packages) non?

Et si ca ne rend rien sous XP, l'executable python étant sensé se trouver à  la racine de l'install (donc au même niveau que lib\ ), on peut envisager d'utiliser sys.executable.

Soit :

import os,sys
lib_path=[]

if os.name=='posix' or os.name=='mac':
    lib_path.append(sys.executable) #executable python, soit habituellement /usr/bin/python
    lib_path.append(os.path.join(sys.exec_prefix,'lib','python2.5','site-packages')) # chemin vers les modules
elif os.name=='nt':
    lib_path.append(sys.executable) # executable python
    lib_path.append(os.path.join(sys.executable,'lib','site-packages')) # chemin vers les modules
else:
    print "Oooops, marche pas :/"
print lib_path

Cela me renvoit chez moi :

['/usr/bin/python', '/usr/lib/python2.5/site-packages']

Dernière modification par Clop' (Le 20/01/2008, à 13:48)


----------------------
Linux on the Root , un site qu'il fait bon feuilleter!
----------------------
PyQtRadio, un lecteur de webradio simple et léger! Installation multi-distrib'

Hors ligne

#7 Le 20/01/2008, à 13:55

trucutu

Re : python : fonction linux/win32 récup. rép. d'install. de python

1 - Au fait, en ce qui concerne sys.path, j'obtiens ça

>>> print sys.path[2]
/usr/lib/python2.5
>>> print sys.path[7]
/usr/lib/python2.5/site-packages

c'est pas ce que tu veux ?
Par contre, je peux pas voir ce que ça donne sous Win dsl....

2 - Si tu veux faire de l'exploration de fichiers/répertoires dans un script, pense à  utiliser os.sep ( équivalant à  "/" sous linux et à  "\" sous Win) pour être protable.


La chanson du dimanche - "La pêche !"
PC acheté chez Novatux : entièrement satisfait.
Faire des recherches solidaires !

Hors ligne

#8 Le 20/01/2008, à 18:37

go2null

Re : python : fonction linux/win32 récup. rép. d'install. de python

Merci à  tous les deux de vous intéresser à  mon problème.

Clop, merci pour sys.exec_prefix qui semble bien fonctionner sous Win32 et comme tu le mentionnes : l'exécutable est à  la racine il est facile d'extrapoler (en restant fiable) l'emplacement du répertoire site-packages.

J'ai envie de dire que pour Win32 l'affaire est entendue.

-

Par contre pour Linux, un print sys.exec_prefix me renvoie /usr :-(

Ta ligne :

lib_path.append(os.path.join(sys.exec_prefix,'lib','python2.5','site-packages')) # chemin vers les modules

ne me convient pas du tout puisque si je pige bien ta démarche tu concatènes /usr + lib + python2.5 + site-packages les 3 dernières chaà®nes étant codées en dur et non détectées.

---

Trucutu, pour Win32 ce serait sys.path[6] et sys.path[7] (respectivement C:\Python25 et C:\Python25\lib\site-packages).

C'est exactement ce que je veux !

MAIS

Ca marche pour Linux Gutsy et Python 2.5, OK...

Qui peut m'assurer que la position des chaines dans la liste générée par sys.path restera la même sous d'autres distributions Linux ou sous FreeBSD et aussi avec des versions plus anciennes de Python ?

Voilà  ce qui m'inquiète et qu'il faut que je teste à  fond avant de décréter cette méthode fiable...
Je vous tiendrais au courant si mes tests sont concluants.

2 - Si tu veux faire de l'exploration de fichiers/répertoires dans un script, pense à  utiliser os.sep ( équivalant à  "/" sous linux et à  "\" sous Win) pour être portable.

Merci c'est noté !

A+

-

PS: J'ai posté ce même topic sur les usenet : http://groups.google.fr/group/fr.comp.lang.python et http://groups.google.fr/group/comp.lang.python?hl=fr
Je vous tiens au courant des solutions intéressantes qui me seront proposées.

#9 Le 20/01/2008, à 21:14

Clop'

Re : python : fonction linux/win32 récup. rép. d'install. de python

go2null a écrit :

Merci à  tous les deux de vous intéresser à  mon problème.

Ta ligne :

lib_path.append(os.path.join(sys.exec_prefix,'lib','python2.5','site-packages')) # chemin vers les modules

ne me convient pas du tout puisque si je pige bien ta démarche tu concatènes /usr + lib + python2.5 + site-packages les 3 dernières chaà®nes étant codées en dur et non détectées.

Effectivement, je concatene ses trois chaines en utilisant le meme postulat que pour win32, qui est que l'architecture des répertoires sera la même puisque géré par l'installation de Python. D'apres la doc, sys.exec_prefix correspond au --exec-prefix du configure.sh, ce qui se trouve apres est donc logiquement standard. 'lib' et 'site-packages' ne changent donc pas, seul 'python2.5' peut poser probleme, mais on peut résoudre cela par :

lib_path.append(os.path.join(sys.exec_prefix,'lib','python'+sys.version[:3],'site-packages'))

Donc, la méthode me parait fiable, mais je peut comprendre que tu ais besoin de plus d'assurance...

PS: J'ai posté ce même topic sur les usenet : http://groups.google.fr/group/fr.comp.lang.python

J'avais vu wink et je guette les réponses smile

PS: Mes excuses pour les coquilles et l'absence d'accents, je suis sur un clavier espagnol en depannage et c'est pas simple....

Dernière modification par Clop' (Le 20/01/2008, à 21:15)


----------------------
Linux on the Root , un site qu'il fait bon feuilleter!
----------------------
PyQtRadio, un lecteur de webradio simple et léger! Installation multi-distrib'

Hors ligne

#10 Le 20/01/2008, à 21:49

go2null

Re : python : fonction linux/win32 récup. rép. d'install. de python

Clop, merci encore, je garde ta méthode de côté au cas où rien de mieux ne serait à disposition.

PS: Il est vrai que si la méthode avec sys.path s'avèrait fiable à 100%, je l'utiliserais de préférence.

A+

#11 Le 20/01/2008, à 22:22

manatlan

Re : python : fonction linux/win32 récup. rép. d'install. de python

arggg ...
je n'arrive plus à mettre la main dessus, mais le path de site-package est dispo dans des objets de distutils ou setuptools.
Je suis tombé dessus pas plus tard qu'il y a 2 semaines, mais j'ai pas noté  .. et je me rappelle plus, mais il est dedans qqpart : c certain

désolé


"Oui, oui."
                -- Shakespeare (Richard III, Acte I, Scène IV)

Hors ligne

#12 Le 21/01/2008, à 00:22

Clop'

Re : python : fonction linux/win32 récup. rép. d'install. de python

Et je crois que Manatlan décroche la timbale smile

 get_python_lib(plat_specific=0, standard_lib=0, prefix=None)
        Return the directory containing the Python library (standard or
        site additions).
        
        If 'plat_specific' is true, return the directory containing
        platform-specific modules, i.e. any module from a non-pure-Python
        module distribution; otherwise, return the platform-shared library
        directory.  If 'standard_lib' is true, return the directory
        containing standard Python library modules; otherwise, return the
        directory for site-specific modules.
        
        If 'prefix' is supplied, use it instead of sys.prefix or
        sys.exec_prefix -- i.e., ignore 'plat_specific'.

Dans le module distutils.sysconfig!

Ce qui retourne:

>>> import distutils.sysconfig
>>> distutils.sysconfig.get_python_lib()
'/usr/lib/python2.5/site-packages'

qui est le but visé, non?


----------------------
Linux on the Root , un site qu'il fait bon feuilleter!
----------------------
PyQtRadio, un lecteur de webradio simple et léger! Installation multi-distrib'

Hors ligne

#13 Le 21/01/2008, à 00:38

go2null

Re : python : fonction linux/win32 récup. rép. d'install. de python

Net et sans bavure, full compatible Linux/Win32 !

C'est exactement ce dont j'avais besoin ; j'adopte ! big_smile

Merci à  tous pour votre aide.

-

Allez j'ose wink : j'aimerais tout de même bien savoir si l'ordre de la liste sys.path est toujours la même sous chaque type de plateforme...

#14 Le 21/01/2008, à 11:21

go2null

Re : python : fonction linux/win32 récup. rép. d'install. de python

Visiblement la réponse est non, on ne peut pas de fier à  l'ordre de la liste générée par sys.path !

> I just would like to know if I would ALWAYS find the install directory
> in sys.path[6] and site-packages directory in sys.path[7] on any Win32
> platform and sys.path[2] and site-packages directory in sys.path[6] on
> any Linux platform.

        Unlikely...

>>> sys.path[6]

'E:\\Python24\\lib\\site-packages\\decoratortools-1.4-py2.4.egg'
>>> sys.path[2]

'E:\\Python24\\lib\\site-packages\\ctypes-1.0.1-py2.4-win32.egg'
>>> sys.path

['', 'E:\\Python24\\lib\\site-packages\\pyopengl-3.0.0a5-py2.4.egg',
'E:\\Python24\\lib\\site-packages\\ctypes-1.0.1-py2.4-win32.egg',
'E:\\Python24\\lib\\site-packages\\sqlobject-0.7.6-py2.4.egg',
'E:\\Python24\\lib\\site-packages\\celementtree-1.0.5_20051216-py2.4-win32.egg',
'E:\\Python24\\lib\\site-packages\\configobj-4.4.0-py2.4.egg',
'E:\\Python24\\lib\\site-packages\\decoratortools-1.4-py2.4.egg',
'E:\\Python24\\lib\\site-packages\\ruledispatch-0.5a0.dev_r2306-py2.4-win32.egg',
'E:\\Python24\\lib\\site-packages\\formencode-0.7.1-py2.4.egg',
'E:\\Python24\\lib\\site-packages\\pastescript-1.3.4-py2.4.egg',
'E:\\Python24\\lib\\site-packages\\elementtree-1.2.6_20050316-py2.4-win32.egg',
'E:\\Python24\\lib\\site-packages\\simplejson-1.7.1-py2.4.egg',
'E:\\Python24\\lib\\site-packages\\cherrypy-2.2.1-py2.4.egg',
'E:\\Python24\\lib\\site-packages\\turbocheetah-0.9.5-py2.4.egg',
'E:\\Python24\\lib\\site-packages\\turbojson-1.0-py2.4.egg',
'E:\\Python24\\lib\\site-packages\\pyprotocols-1.0a0dev_r2302-py2.4-win32.egg',
'E:\\Python24\\lib\\site-packages\\pastedeploy-1.3-py2.4.egg',
'E:\\Python24\\lib\\site-packages\\paste-1.3-py2.4.egg',
'E:\\Python24\\lib\\site-packages\\cheetah-2.0rc8-py2.4.egg',
'E:\\Python24\\lib\\site-packages\\setuptools-0.6c6-py2.4.egg',
'E:\\Python24\\lib\\site-packages\\turbogears-1.0.3.2-py2.4.egg',
'E:\\Python24\\lib\\site-packages\\turbokid-1.0.2-py2.4.egg',
'E:\\Python24\\lib\\site-packages\\kid-0.9.6-py2.4.egg',
'e:\\python24\\lib\\site-packages\\scipy',
'C:\\WINDOWS\\system32\\python24.zip', 'e:\\UserData\\Dennis Lee
Bieber\\My Documents', 'E:\\Python24\\DLLs', 'E:\\Python24\\lib',
'E:\\Python24\\lib\\plat-win', 'E:\\Python24\\lib\\lib-tk',
'E:\\Python24\\Lib\\site-packages\\pythonwin', 'E:\\Python24',
'E:\\Python24\\lib\\site-packages',
'E:\\Python24\\lib\\site-packages\\Numeric',
'E:\\Python24\\lib\\site-packages\\PIL',
'E:\\Python24\\lib\\site-packages\\win32',
'E:\\Python24\\lib\\site-packages\\win32\\lib',
'E:\\Python24\\lib\\site-packages\\wx-2.8-msw-unicode']

#15 Le 21/01/2008, à 11:58

go2null

Re : python : fonction linux/win32 récup. rép. d'install. de python

J'amène encore une petite pierre à  ce topic que j'ai ouvert.

Je viens de tester distutils.sysconfig.get_python_lib(), sys.executable et sys.path sur un FreeBSD6 pré-installé (voir www.pcbsd.org).

Pour distutils.sysconfig.get_python_lib(), j'obtiens :
'/usr/local/lib/python2.5/site_packages'

Pour sys.executable, j'obtiens :
'/usr/local/bin/python'

Tutti va bene !

-

Enfin pour sys.path, je retrouve bien les deux chemins aux mêmes emplacements dans la liste que sur un Linux Ubuntu Gutsy, c.a.d. sys.path[2] et sys.path[6].

Cependant, vu le précédent message, j'abandonne cette méthode...

A+ big_smile

#16 Le 21/01/2008, à 12:57

aleph

Re : python : fonction linux/win32 récup. rép. d'install. de python

> go2null

Je pense, pour ne pas dire je suis certain, que tu fais fausse route. Ton inexpérience de Python (aucun reproche ici, tout le monde  a été débutant), te mène à  chercher vainement et inutilement des solutions à  des problèmes qui n'en sont pas.

Je perçois très bien ton problème et vois o๠tu bloques. Tu ne maà®trises pas ou mal le mécanisme d'importation des modules et toute la machinerie sous-jacente qui l'accompagne, par ex. ce qu'est le sys.path, son utilité et son fonctionnement.

Quelle solution proposer ? Difficile de répondre en quelques lignes, je ne peux que t'inviter
1) à  plonger dans la documentation, surtout la documentation officielle et non ce que l'on trouve sur le web.
2) à  continuer dans ton apprentissage d'écriture de code Python sans trop s'occuper des questions que tu poses ici. Je suis persuadé qu'à  un moment ou un autre, le déclic se fera.

A la question posée en début de ce fil de discussion, "application compatible Linux/win32/autre OS", la réponse est à  nuancer, mais globalement c'est oui.

Se poser la question de la compatibilté déjà  à  ce niveau n'est pas une bonne approche. Elle viendra tout naturellement et sans difficulté avec plus d'expérience et ceci d'autant plus que la programmation est faite proprement.

L'écriture de code Python est une chose, la compréhension du fonctionnement de Python en est une autre.

Tu trouveras aussi ici http://forum.ubuntu-fr.org/viewtopic.php?id=110312 quelques remarques pertinentes sur le fonctionnement de Python.

PS. La piste proposée par manatlan (qui maà®trise Python) est bonne, mais elle ne concerne pas ce que tu veux faire, des applications Python et non des applications que étendent la structure de Python.

PS2 Le sys.path d'une de mes applications sous win32.

>>> for e in sys.path:
        print e
        
C:\jm\jmpy\psi\psi83\dist\library.zip
C:\jm\jmpy\psi\psi83\dist
>>> import wx
>>> print wx.version()
2.8.7.1 (msw-ansi)

et pourtant, je peux avoir accès à  toutes les bibliothèques Python qu'elles soient sur mon disque dur, une clé usb ou un cdrom. Etonnant ? Non ! Uniquement un exemple de bonne utilisation de Python.

#17 Le 21/01/2008, à 17:32

go2null

Re : python : fonction linux/win32 récup. rép. d'install. de python

Merci pour tes conseils.

Salut aleph,

Ce que tu dis est certainement vrai, en tant que débutant il y a des tas de mécanismes que me sont étrangers.

Ce que je sais et veux c'est écrire des applications qui feront leur(s) job(s) aussi bien sous Win32 que sous Linux. Je m'y prends peut-être mal (selon toi) en commençant par essayer de définir quelques fonctions de base qui me permettront d'identifier l'environnement et ses contraintes/spécificités ; cela me paraissait pourtant logique.

Ensuite une fois acquise la certitude que Python répondra bien à  mon besoin initial, j'avais l'intention d'approfondir petit à  petit mes connaissances du langage et par conséquent de ses mécanismes internes.

Ce qui m'a amené à  choisir Python, c'est à  90% parce que ce langage de programmation existe sur quasiment tous les OS/plateformes et pour les 10% restants parce que la syntaxe de base n'est pas trop compliquée (du moins au début).

Ayant quelques bases en Visual Basic, si les programmes en VBScript avaient pu être adaptés à  d'autres plateformes, je ne me serais même pas intéressé à  Python.

Merci pour tes encouragements.