Come posso trovare la posizione dei sorgenti del modulo Python?


481

Come faccio a sapere dove è installato il file sorgente per un determinato modulo Python? Il metodo è diverso su Windows rispetto a Linux?

Sto cercando di cercare in particolare la fonte del datetimemodulo, ma sono interessato anche a una risposta più generale.

Risposte:


375

Per un modulo Python puro puoi trovare la fonte guardando themodule.__file__. Il modulo datetime, tuttavia, è scritto in C e quindi datetime.__file__punta a un file .so (non ce n'è datetime.__file__su Windows) e, pertanto, non è possibile visualizzare l'origine.

Se scarichi un tarball sorgente Python e lo estrai, il codice dei moduli può essere trovato nella sottodirectory Modules .

Ad esempio, se vuoi trovare il codice datetime per python 2.6, puoi guardare

Python-2.6/Modules/datetimemodule.c

Puoi anche trovare l'ultima versione di Mercurial sul Web all'indirizzo https://hg.python.org/cpython/file/tip/Modules/_datetimemodule.c


Se modifichi la tua risposta per indicare che datetime .__ file__ punta a un .so su Linux e Mac OS X (sebbene su Windows l'oggetto modulo datetime non abbia alcun attributo di file ), accetterò la tua risposta.
Daryl Spitzer,

In realtà su Windows (almeno sulla versione che sto usando), datetime non ha un attributo di file .
Daryl Spitzer,

221

In esecuzione python -vdalla riga di comando dovrebbe dirti cosa viene importato e da dove. Questo funziona per me su Windows e 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
...

Non sono sicuro di cosa siano quei brutti mtime sulla mia installazione!


8
Freddo! Puoi anche digitare la tua specifica dichiarazione di importazione dopo che si è aperta in modalità interattiva per vedere da dove proviene la lib specifica.
scorpiodawg,

3
Dove sono i built-inmoduli?
Loretoparisi,

120

Mi rendo conto che questa risposta è in ritardo di 4 anni, ma le risposte esistenti sono persone fuorvianti.

Il modo giusto per farlo non è mai __file__, o cercare di attraversare sys.pathe cercare te stesso, ecc. (A meno che non sia necessario essere retrocompatibili oltre la 2.1).

È il inspectmodulo, in particolare, getfileoppure getsourcefile.

A meno che tu non voglia imparare e implementare le regole (che sono documentate, ma dolorose, per CPython 2.xe non documentate affatto per altre implementazioni, o 3.x) per il mapping .pycsu .pyfile; gestire archivi .zip, uova e pacchetti di moduli; provare diversi modi per ottenere il percorso di .so/ .pydfile che non supportano __file__; capire cosa fanno Jython / IronPython / PyPy; ecc. In tal caso, provaci.

Nel frattempo, la fonte di ogni versione di Python dalla 2.0+ è disponibile online su http://hg.python.org/cpython/file/X.Y/(ad es. 2.7 o 3.3 ). Quindi, una volta scoperto che inspect.getfile(datetime)è un .soo un .pydfile /usr/local/lib/python2.7/lib-dynload/datetime.so, puoi cercarlo nella directory dei moduli. A rigor di termini, non c'è modo di essere sicuri di quale file definisce quale modulo, ma quasi tutti sono o foo.co foomodule.c, quindi non dovrebbe essere difficile indovinare che datetimemodule.c è quello che vuoi.


3
Perché __file__non è applicabile per i non incorporati? Capisco dove la scansione di sys.path può essere dolorosa (soprattutto senza conoscere meta_path), ma ti preoccupi dello spazio dei nomi tra __file__definizioni e binari?

1
Faccio questo in 2.7.8 su datetime e ottengo un TypeError sia per getfile che per getourcefile. Personalmente ho più versioni di Python installate e ho bisogno di sapere QUALE versione di datetimemodule.c è indicata, perché in questo momento so che non è puntata su quella a cui dovrebbe essere puntata data la versione dell'interprete che è in esecuzione ...
mmitchell

1
@mmitchell: se stai ottenendo un TypeError da inspect.getfile (datetime), supponendo che datetime sia in realtà il modulo e non qualcos'altro che hai assegnato allo stesso nome, sono abbastanza sicuro che significa che hai creato una build personalizzata per collega staticamente in datetime all'interprete invece di renderlo un modulo caricabile. Ma potrebbero esserci altri motivi a cui non ho pensato. È necessario porre una nuova domanda e fornire molte più informazioni per riprodurlo.
abarnert,

@mmitchell: Nel frattempo, non c'è modo di scoprire a quale versione di datetimemodule.c sta puntando, perché non sta puntando a datetimemodule.c, sta puntando a un modulo compilato creato da quel file C; il file C potrebbe non esistere sul tuo sistema, potrebbe essere stato modificato da quando lo hai compilato, qualunque cosa.
abarnert,

@tristan: non sono sicuro di aver capito cosa stai chiedendo, ma forse questo risponderà: ogni volta che __file__funziona, inspect.getfilefunziona; non vi è alcuna situazione in cui indovinare se usare __file__sarà meglio che usare semplicemente il modulo inspect.
abarnert,

67

L' sys.pathelenco contiene l'elenco delle directory che verranno ricercate per i moduli in fase di esecuzione:

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

10
python -c 'import sys; print "\n".join(sys.path)'ti permetterà di visualizzarlo senza dover passare a Python interattivo.
Joe Block,

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

61

Se si utilizza pip per installare i moduli, pip show $moduleviene restituita solo la posizione.


10
(Penso che sia $modulestato inteso come una variabile segnaposto, non letteralmente ciò che si dovrebbe scrivere. Ad esempio, m=numpy; pip show $mecc. Per qualsiasi m)
michael

questa dovrebbe essere contrassegnata come la risposta più accurata alla domanda posta.
Rahul Goyal,

37

dalla libreria standard provare 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))

1
È fantastico. Avevo apt-get removeDataDog e potevo ancora importarlo. Questo mi ha aiutato a trovare dove erano i file (così ho potuto eliminarli) quando le altre soluzioni non hanno aiutato.
sg

per python3.x, il imppacchetto è deprecato (dalla versione 3.4) in favore di importlib(dal 3.1) docs.python.org/3.6/library/imp.html
michael

Ora devi usarlo in questo modo per python3. import importlibpoiimportlib.util.find_spec('fontTools')
Medhat il

33

datetime è un modulo integrato, quindi non esiste un file sorgente (Python).

Per i moduli provenienti da .py(o .pyc) file, è possibile utilizzare mymodule.__file__, ad es

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

12

Nell'interprete python è possibile importare il modulo particolare e quindi digitare help (modulo). Questo fornisce dettagli come Nome, File, Modulo Documenti, Descrizione e altri.

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


Questo mi ha fornito un percorso completo per il file del modulo, mentre altre risposte hanno fornito solo percorsi relativi. Grazie.
Jerther,

12

Ecco un one-liner per ottenere il nome file per un modulo, adatto per l'aliasing della shell:

echo 'import sys; t=__import__(sys.argv[1],fromlist=[\".\"]); print(t.__file__)'  | python - 

Configurato come alias:

alias getpmpath="echo 'import sys; t=__import__(sys.argv[1],fromlist=[\".\"]); print(t.__file__)'  | python - "

Usare:

$ getpmpath twisted
/usr/lib64/python2.6/site-packages/twisted/__init__.pyc
$ getpmpath twisted.web
/usr/lib64/python2.6/site-packages/twisted/web/__init__.pyc


9

Dai un'occhiata a questo elegante comando "cdp" per eseguire il cd nella directory contenente il sorgente per il modulo Python indicato:

cdp () {
  cd "$(python -c "import os.path as _, ${1}; \
    print _.dirname(_.realpath(${1}.__file__[:-1]))"
  )"
}

Grazie! È proprio quello che stavo cercando. Abbastanza strano, non includerebbero qualcosa del genere nella distribuzione di Python.
Antony Hatchkins,

9

Su Windows puoi trovare la posizione del modulo Python come mostrato di seguito: cioè trovare il modulo rest_framework inserisci qui la descrizione dell'immagine


4

Su Ubuntu 12.04, ad esempio il pacchetto numpy per python2, è disponibile all'indirizzo:

/usr/lib/python2.7/dist-packages/numpy

Naturalmente, questa non è una risposta generica


0

Non tutti i moduli Python sono scritti in Python. Datetime sembra essere uno di quelli che non lo sono, e (su Linux) è datetime.so.

Dovresti scaricare il codice sorgente nella libreria standard di Python per ottenerlo.


2
Daryl: Hai interpretato male la risposta di Jim, "Datetime sembra essere uno dei moduli Python non scritti in Python".
Matthew Trevor,

0

Per coloro che preferiscono una soluzione GUI: se stai usando una GUI come Spyder (parte dell'installazione di Anaconda) puoi semplicemente fare clic con il tasto destro del mouse sul nome del modulo (come "csv" in "import csv") e selezionare "go alla definizione "- questo aprirà il file, ma anche in alto puoi vedere la posizione esatta del file (" C: .... csv.py ")


0

Se non si utilizza interprete, è possibile eseguire il codice seguente:

import site
print (site.getsitepackages())

Produzione:

['C:\\Users\\<your username>\\AppData\\Local\\Programs\\Python\\Python37', 'C:\\Users\\<your username>\\AppData\\Local\\Programs\\Python\\Python37\\lib\\site-packages']

Il secondo elemento in Array sarà la posizione del pacchetto. In questo caso:

C:\Users\<your username>\AppData\Local\Programs\Python\Python37\lib\site-packages

0

Un altro modo per verificare se sul terminale sono installate più versioni di Python.

-MBP: ~ python3 -m pip mostra pyperclip

Ubicazione: /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-

MBP: ~ python -m pip mostra pyperclip

Ubicazione: /Users/umeshvuyyuru/Library/Python/2.7/lib/python/site-packages


-1

In un IDE come Spyder, importare il modulo e quindi eseguirlo singolarmente. inserisci qui la descrizione dell'immagine


L'importazione e la stampa str()del modello è una descrizione più accurata di ciò che si sta facendo nello screenshot, inoltre l'IDE sembra irrilevante per questa soluzione
mousetail

2
Benvenuto in StackOverflow! Si prega di non pubblicare codice utilizzando immagini. Le immagini sono difficili da leggere, non possono essere cercate e non sono visualizzabili da alcuni lettori. Invece, includi qualsiasi codice pertinente direttamente nel corpo della tua risposta.
Brian,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.