Comment puis-je trouver l'emplacement des sources du module Python?
Comment puis-je savoir où le fichier source d'un module Python donné est installé? La méthode est-elle différente sur Windows que sur Linux?
j'essaie de trouver la source du module datetime
en particulier, mais je suis intéressé par une réponse plus générale ainsi.
16 réponses
pour un module python pur, vous pouvez trouver la source en regardant themodule.__file__
.
Le module datetime, cependant, est écrit en C, et donc datetime.__file__
points à A. donc, fichier (il n'y a pas de datetime.__file__
sur Windows), et par conséquent, vous ne pouvez pas voir la source.
si vous téléchargez une archive source python et que vous l'extrayez, le code des modules se trouve dans le sous-répertoire Modules .
Par exemple, si vous voulez trouver le code datetime pour python 2.6, vous pouvez regarder
Python-2.6/Modules/datetimemodule.c
vous pouvez également trouver la dernière version Mercurial sur le web à https://hg.python.org/cpython/file/tip/Modules/_datetimemodule.c
L'exécution python -v
de la ligne de commande devrait vous dire ce qui est importé et d'où. Cela fonctionne pour moi sur 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 mtime 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 ceci n'est jamais __file__
, ou essayer de marcher à travers sys.path
et chercher pour vous-même, etc. (sauf si vous devez être rétro-compatible au-delà de 2.1).
c'est le inspect
module-en particulier, getfile
ou getsourcefile
.
Si vous voulez apprendre et mettre en œuvre les règles (qui sont documentées, mais douloureuses, pour CPython 2.x, et non documenté pour les autres implémentations, ou 3.x) pour la mise en correspondance des fichiers .pyc
à .py
; traitement .archives zip, eggs, et paquets de modules; essayer différentes façons d'obtenir le chemin vers les fichiers .so
/ .pyd
qui ne supportent pas __file__
; comprendre ce que font Jython/IronPython/PyPy; etc. Dans ce cas, aller pour elle.
pendant ce temps, chaque version de Python 2.0+ est disponible en ligne à http://hg.python.org/cpython/file/X.Y/
(par exemple, 2.7 ou 3.3 ). Donc, 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 chercher dans le répertoire Modules. À proprement parler, il n'y a aucun moyen d'être sûr de quel fichier définit quel module , mais presque tous sont soit foo.c
ou foomodule.c
, donc il ne devrait pas être difficile de deviner que datetimemodule.C est ce que vous voulez.
la liste sys.path
contient la liste des répertoires qui seront recherchés pour les modules à 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, juste pip show $module
l'emplacement est retourné.
datetime
est un module intégré, il n'y a donc pas de fichier source (Python).
pour les modules provenant des fichiers .py
(ou .pyc
), vous pouvez utiliser mymodule.__file__
, par exemple
> import random
> random.__file__
'C:\Python25\lib\random.pyc'
de la bibliothèque standard essayer 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))
dans l'interpréteur python vous pouvez importer le module particulier et ensuite taper help(module). Cela donne des détails tels que le nom, le fichier, le Module Docs, la Description et autres.
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
nouveau en Python 3.2, vous pouvez maintenant utiliser par exemple code_info()
du module dis:
http://docs.python.org/dev/whatsnew/3.2.html#dis
Cochez cette nifty " cdp "commande pour cd dans le répertoire contenant la source du module Python indiqué:
cdp () {
cd "$(python -c "import os.path as _, ; \
print _.dirname(_.realpath(.__file__[:-1]))"
)"
}
Voici une doublure unique pour obtenir le nom de fichier d'un module, adapté à l'alias de l'interpréteur de commandes:
echo 'import sys; t=__import__(sys.argv[1],fromlist=[\".\"]); print(t.__file__)' | python -
créé comme 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
sous windows, vous pouvez trouver l'emplacement du module python comme suit:i. E trouver le module rest_fram Framework
sur Ubuntu 12.04, par exemple le paquet numpy pour python2, peut être trouvé à:
/usr/lib/python2.7/dist-packages/numpy
bien sûr, ce n'est pas une réponse générique
tous les modules python ne sont pas écrits en python. Datetime se trouve être l'un d'eux qui ne l'est pas, et (sous linux) est datetime.alors?
, Vous devez télécharger le code source de la bibliothèque standard python.
pour ceux qui préfèrent une solution GUI: si vous utilisez une gui telle que Spyder (une partie de l'installation Anaconda) , vous pouvez tout simplement droit-cliquez sur le nom du module (tel que "csv" dans "importer csv") et sélectionnez "Aller à la définition" - cela ouvrira le fichier, mais aussi sur le dessus, vous pouvez voir l'emplacement exact du fichier ("C:....csv.py")
vous pouvez voir la source directement à partir du Git repository . Par exemple, voici le module datetime et comme bonus, le module de sous-processus .
si vous creusez plus autour de vous, vous pouvez trouver l'implémentation traditionnelle de l'interpréteur Python standard, qui est écrit en 'C’ et aussi appelé 'CPython’