578 votes

Comment puis-je trouver l'emplacement des sources des modules Python ?

Comment puis-je savoir où est installé le fichier source d'un module Python donné ? La méthode est-elle différente sous Windows et sous Linux ?

J'essaie de chercher la source de la datetime en particulier, mais je suis également intéressé par une réponse plus générale.

441voto

Moe Points 6698

Pour un module purement python, vous pouvez trouver la source en regardant à themodule.__file__ . Le module datetime, cependant, est écrit en C, et donc datetime.__file__ pointe vers un fichier .so (il n'y a pas de fichier .so). datetime.__file__ sur Windows), et donc, vous ne pouvez pas voir la source.

Si vous téléchargez une archive des sources python et que vous l'extrayez, le code des modules se trouve dans le fichier Modules sous-répertoire.

Par exemple, si vous voulez trouver le code de l'heure de la date pour python 2.6, vous pouvez consulter le site suivant

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

0 votes

Si vous modifiez votre réponse pour indiquer que datetime.__file__ pointe vers un fichier .so sous Linux et Mac OS X (bien que sous Windows l'objet du module datetime n'ait pas d'objet fichier attribut), j'accepte votre réponse.

0 votes

En fait, sous Windows (du moins sur la version que j'utilise), datetime n'a pas de fonction fichier attribut.

256voto

jblocksom Points 4504

Running python -v de la ligne de commande devrait vous indiquer ce qui est importé et d'où. 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 sont ces mauvais mtime sur mon installation !

10 votes

Cool ! Vous pouvez également saisir votre propre instruction d'importation spécifique après l'ouverture en mode interactif pour voir d'où vient la librairie spécifique.

5 votes

Où sont built-in des modules ?

144voto

abarnert Points 94246

Je réalise que cette réponse a 4 ans de retard, mais les réponses existantes induisent les gens en erreur.

La bonne façon de faire n'est jamais __file__ ou en essayant de marcher à travers sys.path et chercher par vous-même, etc. (sauf si vous avez besoin d'être rétrocompatible au-delà de la 2.1).

C'est le inspect en particulier, getfile o getsourcefile .

À moins que vous ne souhaitiez apprendre et mettre en œuvre les règles (qui sont documentées, mais douloureuses, pour CPython 2.x, et pas du tout documentées pour les autres implémentations, ou 3.x) pour le mappage de .pyc à .py traiter les archives .zip, les œufs et les paquets de modules ; essayer différentes manières d'obtenir le chemin d'accès à .so / .pyd qui ne prennent pas en charge __file__ ; comprendre ce que font Jython/IronPython/PyPy ; etc. Dans ce cas, allez-y.

Entre-temps, les sources de chaque version de Python depuis la 2.0+ sont disponibles en ligne à l'adresse suivante http://hg.python.org/cpython/file/X.Y/ (par exemple, 2.7 o 3.3 ). Donc, une fois que vous avez découvert que inspect.getfile(datetime) est un .so o .pyd comme /usr/local/lib/python2.7/lib-dynload/datetime.so vous pouvez le consulter 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 o foomodule.c donc il ne devrait pas être difficile de deviner que datetimemodule.c est ce que vous voulez.

3 votes

Pourquoi l'est __file__ non applicable pour les non-builtins ? Je comprends que l'exploration de sys.path peut être pénible (surtout sans connaître meta_path), mais est-ce que votre préoccupation concernant l'espacement des noms entre les fichiers __file__ les définitions et les binaires ?

2 votes

Je fais cela en 2.7.8 sur datetime et j'obtiens juste un TypeError pour getfile et getsourcefile. Personnellement, j'ai plusieurs versions de python installées et j'ai besoin de savoir sur QUELLE version de datetimemodule.c il pointe, parce que pour l'instant, je sais qu'il ne pointe pas sur celle qu'il devrait pointer étant donné la version de l'interpréteur qui tourne...

1 votes

@mmitchell : Si vous obtenez une TypeError de inspect.getfile(datetime), en supposant que datetime est réellement le module et non quelque chose d'autre que vous avez assigné au même nom, je suis presque sûr que cela signifie que vous avez fait une construction personnalisée pour lier statiquement datetime à l'interpréteur au lieu d'en faire un module chargeable. Mais il pourrait y avoir d'autres raisons auxquelles je n'ai pas pensé. Vous devez poser une nouvelle question, et donner beaucoup plus d'informations pour reproduire ce problème.

78voto

Greg Hewgill Points 356191

El sys.path La liste contient la liste des répertoires qui seront recherchés pour les modules au moment de l'exécution :

python -v
>>> import sys
>>> sys.path
['', '/usr/local/lib/python25.zip', '/usr/local/lib/python2.5', ... ]

10 votes

python -c 'import sys; print "\n".join(sys.path)' vous permettra de le visualiser sans devoir passer par le langage python interactif.

7 votes

Python 3 : python -c 'import sys; print("\n".join(sys.path))'

44voto

Bjarke Ebert Points 955

datetime est un module intégré, il n'y a donc pas de fichier source (Python).

Pour les modules provenant de .py (ou .pyc ), vous pouvez utiliser mymodule.__file__ par exemple

> import random
> random.__file__
'C:\\Python25\\lib\\random.pyc'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X