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.

387
demandé sur Zizouz212 2008-11-06 21:36:52

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

318
répondu Moe 2015-09-09 06:12:12

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!

194
répondu jblocksom 2008-11-06 18:40:27

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.

102
répondu abarnert 2012-12-15 00:31:15

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', ... ]
46
répondu Greg Hewgill 2013-05-02 15:06:20

si vous utilisez pip pour installer vos modules, juste pip show $module l'emplacement est retourné.

39
répondu James Mark Mackenzie 2015-09-25 14:27:58

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'
28
répondu Bjarke Ebert 2008-11-06 18:41:56

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))
26
répondu Codespaced 2013-05-04 02:40:30

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

11
répondu Vijay 2011-05-17 12:49:20

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

10
répondu Tom 2011-02-23 10:56:12

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]))"
  )"
}
8
répondu Daryl Spitzer 2013-07-08 22:25:58

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
5
répondu Ernest 2018-10-02 09:19:41

sous windows, vous pouvez trouver l'emplacement du module python comme suit:i. E trouver le module rest_fram Framework enter image description here

4
répondu Dun0523 2014-06-09 10:04:36

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

3
répondu nexayq 2016-06-22 14:18:30

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.

0
répondu JimB 2011-11-30 13:43:55

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")

0
répondu Alona Levy 2014-12-01 14:00:13

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’

-1
répondu brother-bilo 2018-10-02 13:02:29