web-dev-qa-db-fra.com

Comment trouver l'emplacement de Python sources de module?

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.

443
Daryl Spitzer

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

347
Moe

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!

209
jblocksom

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.

113
abarnert

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', ... ]
63
Greg Hewgill

Si vous utilisez pip pour installer vos modules, seul pip show $module l'emplacement est renvoyé.

50

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))
31
Codespaced

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'
29
Bjarke Ebert

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

12
Vijay

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
10
Ernest

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

10
Tom

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]))"
  )"
}
9
Daryl Spitzer

Sous Windows, vous pouvez trouver l'emplacement du module python comme indiqué ci-dessous: i.e find rest_framework module enter image description here

7
Dun0523

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

4
nexayq

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

0
Alona

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.

0
JimB