Comment apprendre où le fichier source d'un module Python donné est installé? La méthode est-elle différente sous Windows par rapport à Linux?
J'essaie de trouver la source du module datetime
en particulier, mais une réponse plus générale m'intéresse également.
Pour un pur module python, vous pouvez trouver la source en consultant themodule.__file__
. Le module datetime, cependant, est écrit en C et par conséquent, datetime.__file__
pointe vers un fichier .so (il n'y a pas de datetime.__file__
sur Windows) et vous ne pouvez donc pas voir la source.
Si vous téléchargez et extrayez une archive tar source python, vous trouverez le code des modules dans le sous-répertoire Modules .
Par exemple, si vous voulez trouver le code datetime pour python 2.6, vous pouvez consulter
Python-2.6/Modules/datetimemodule.c
Vous pouvez également trouver la dernière version de Mercurial sur le Web à l’adresse suivante: https://hg.python.org/cpython/file/tip/Modules/_datetimemodule.c
Lancer python -v
depuis la ligne de commande devrait vous dire ce qui est importé et de quel endroit. Cela fonctionne pour moi sous Windows et Mac OS X.
C:\>python -v
# installing zipimport hook
import zipimport # builtin
# installed zipimport hook
# C:\Python24\lib\site.pyc has bad mtime
import site # from C:\Python24\lib\site.py
# wrote C:\Python24\lib\site.pyc
# C:\Python24\lib\os.pyc has bad mtime
import os # from C:\Python24\lib\os.py
# wrote C:\Python24\lib\os.pyc
import nt # builtin
# C:\Python24\lib\ntpath.pyc has bad mtime
...
Je ne suis pas sûr de ce que ces mauvais temps sont sur mon installation!
Je me rends compte que cette réponse a 4 ans de retard, mais les réponses existantes sont trompeuses.
La bonne façon de faire est de ne jamais utiliser __file__
ou d'essayer de parcourir sys.path
et de vous rechercher, etc. (sauf si vous avez besoin d'une compatibilité ascendante au-delà de la version 2.1).
C'est le inspect
, en particulier getfile
ou getsourcefile
.
Sauf si vous souhaitez apprendre et implémenter les règles (qui sont documentées, mais douloureuses, pour CPython 2.x, et non documentées du tout pour les autres implémentations, ou 3.x) pour mapper .pyc
à .py
des dossiers; gérer les archives .zip, les oeufs et les modules; essayer différentes façons d'obtenir le chemin d'accès aux fichiers .so
/.pyd
qui ne prennent pas en charge __file__
; déterminer ce que font Jython/IronPython/PyPy; etc. Dans ce cas, allez-y.
Pendant ce temps, toutes les sources de la version Python à partir de la version 2.0+ sont disponibles en ligne à l'adresse http://hg.python.org/cpython/file/X.Y/
(par exemple, 2.7 ou . ). Ainsi, une fois que vous avez découvert que inspect.getfile(datetime)
est un fichier .so
ou .pyd
comme /usr/local/lib/python2.7/lib-dynload/datetime.so
, vous pouvez le rechercher dans le répertoire Modules. Strictement parlant, il n’ya aucun moyen de savoir avec certitude quel fichier définit quel module, mais ils sont presque tous soit foo.c
ou foomodule.c
, il n’est donc pas difficile de deviner que datetimemodule .c c'est ce que vous voulez.
La liste sys.path
contient la liste des répertoires dans lesquels les modules seront recherchés lors de l'exécution:
python -v
>>> import sys
>>> sys.path
['', '/usr/local/lib/python25.Zip', '/usr/local/lib/python2.5', ... ]
Si vous utilisez pip pour installer vos modules, seul pip show $module
l'emplacement est renvoyé.
depuis la bibliothèque standard, essayez imp.find_module
>>> import imp
>>> imp.find_module('fontTools')
(None, 'C:\\Python27\\lib\\site-packages\\FontTools\\fontTools', ('', '', 5))
>>> imp.find_module('datetime')
(None, 'datetime', ('', '', 6))
datetime
est un module intégré, il n'y a donc pas de fichier source (Python).
Pour les modules provenant de fichiers .py
(ou .pyc
), vous pouvez utiliser mymodule.__file__
, par exemple.
> import random
> random.__file__
'C:\\Python25\\lib\\random.pyc'
Dans l'interpréteur python, vous pouvez importer le module en question puis taper help (module). Cela donne des détails tels que Nom, Fichier, Documentation du module, Description et al.
Ex:
import os
help(os)
Help on module os:
NAME
os - OS routines for Mac, NT, or Posix depending on what system we're on.
FILE
/usr/lib/python2.6/os.py
MODULE DOCS
http://docs.python.org/library/os
DESCRIPTION
This exports:
- all functions from posix, nt, os2, or ce, e.g. unlink, stat, etc.
- os.path is one of the modules posixpath, or ntpath
- os.name is 'posix', 'nt', 'os2', 'ce' or 'riscos'
et al
Voici un one-liner pour obtenir le nom du fichier correspondant à un module, adapté au alias Shell:
echo 'import sys; t=__import__(sys.argv[1],fromlist=[\".\"]); print(t.__file__)' | python -
Configuré comme un alias:
alias getpmpath="echo 'import sys; t=__import__(sys.argv[1],fromlist=[\".\"]); print(t.__file__)' | python - "
Utiliser:
$ getpmpath twisted
/usr/lib64/python2.6/site-packages/twisted/__init__.pyc
$ getpmpath twisted.web
/usr/lib64/python2.6/site-packages/twisted/web/__init__.pyc
Nouveau dans Python 3.2, vous pouvez maintenant utiliser par exemple code_info()
du module dis: http://docs.python.org/dev/whatsnew/3.2.html#dis
Découvrez ceci commande "cdp" astucieuse pour accéder au répertoire contenant le source du module Python indiqué:
cdp () {
cd "$(python -c "import os.path as _, ${1}; \
print _.dirname(_.realpath(${1}.__file__[:-1]))"
)"
}
Sous Windows, vous pouvez trouver l'emplacement du module python comme indiqué ci-dessous: i.e find rest_framework module
Sur Ubuntu 12.04, par exemple le paquet numpy pour python2, peut être trouvé à l’adresse suivante:
/usr/lib/python2.7/dist-packages/numpy
Bien sûr, ce n'est pas une réponse générique
Pour ceux qui préfèrent une solution graphique: si vous utilisez une interface graphique telle que Spyder (faisant partie de l'installation d'Anaconda), vous pouvez simplement cliquer avec le bouton droit de la souris sur le nom du module (tel que "csv" dans "import csv") et sélectionner "go to definition "- cela ouvrira le fichier, mais vous pourrez également voir l'emplacement exact du fichier (" C: .... csv.py ")
Tous les modules python ne sont pas écrits en python. Il se trouve que datetime est l'un d'entre eux qui ne l'est pas, et (sous linux) est datetime.so.
Vous devez télécharger le code source dans la bibliothèque standard python pour l'obtenir.