Jak znaleźć lokalizację źródeł modułów Pythona?

Jak mogę dowiedzieć się, gdzie jest zainstalowany plik źródłowy danego modułu Pythona? Czy metoda jest inna w Windowsie niż w Linuksie?

Staram się szukać źródła modułu datetime w szczególności, ale interesuje mnie również bardziej ogólna odpowiedź.

 387
Author: Zizouz212, 2008-11-06

16 answers

Dla czystego modułu Pythona można znaleźć źródło, patrząc na themodule.__file__. Moduł datetime jest jednak napisany w języku C i dlatego datetime.__file__ wskazuje na plik. so (nie ma {[2] } w systemie Windows), a więc nie widać źródła.

Jeśli pobierasz Pythona i rozpakowujesz go, kod modułów znajduje się w podkatalogu Modules.

Na przykład, jeśli chcesz znaleźć kod datetime dla Pythona 2.6, możesz spojrzeć na

Python-2.6/Modules/datetimemodule.c

Możesz również znaleźć najnowszą wersję Mercurial w Internecie na https://hg.python.org/cpython/file/tip/Modules/_datetimemodule.c

 318
Author: Moe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-09 06:12:12

Uruchomienie python -v z linii poleceń powinno powiedzieć co i skąd jest importowane. To działa dla mnie na Windows i 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
...

Nie jestem pewien, co te złe mtime są na mojej instalacji!

 194
Author: jblocksom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-06 18:40:27

Zdaję sobie sprawę, że ta odpowiedź spóźnia się 4 lata, ale istniejące odpowiedzi wprowadzają ludzi w błąd.

Dobrym sposobem na to jest nigdy __file__, lub próba przejścia {[1] } i poszukiwania siebie itp. (chyba że musisz być wstecznie kompatybilny poza 2.1).

To inspect moduł-w szczególności getfile lub getsourcefile.

Chyba, że chcesz nauczyć się i wdrożyć zasady (które są udokumentowane, ale bolesne, dla CPython 2.x, a nie udokumentowane w ogóle dla innych wdrożenia, lub 3.x) do mapowania .pyc do .py plików;archiwa zip, jajka i pakiety modułów; próbuje różnych sposobów, aby uzyskać ścieżkę do .so/.pyd pliki, które nie obsługują __file__; W takim razie, śmiało.

Tymczasem źródła każdej wersji Pythona z wersji 2.0+ są dostępne online pod adresem http://hg.python.org/cpython/file/X.Y/ (np., 2.7 lub 3.3). Tak więc, gdy odkryjesz, że inspect.getfile(datetime) jest .so lub .pyd plikiem takim jak /usr/local/lib/python2.7/lib-dynload/datetime.so, możesz sprawdzić to wewnątrz katalogu modułów. Ściśle mówiąc, nie ma sposobu, aby być pewnym, który plik definiuje który moduł, ale prawie wszystkie z nich to foo.c lub foomodule.c, więc nie powinno być trudno zgadnąć, że datetimemodule.c jest tym, czego chcesz.

 102
Author: abarnert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-15 00:31:15

Lista sys.path zawiera listę katalogów, które będą przeszukiwane dla modułów w czasie wykonywania:

python -v
>>> import sys
>>> sys.path
['', '/usr/local/lib/python25.zip', '/usr/local/lib/python2.5', ... ]
 46
Author: Greg Hewgill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-02 15:06:20

Jeśli używasz pip do instalacji modułów, po prostu pip show $module zwracana jest lokalizacja.

 39
Author: James Mark Mackenzie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-25 14:27:58

datetime jest wbudowanym modułem, więc nie ma pliku źródłowego (Pythona).

Dla modułów pochodzących z Plików .py (lub .pyc), można użyć mymodule.__file__, np.

> import random
> random.__file__
'C:\\Python25\\lib\\random.pyc'
 28
Author: Bjarke Ebert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-06 18:41:56

From the standard library try 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
Author: Codespaced,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-04 02:40:30

W interpreterze Pythona można zaimportować konkretny moduł, a następnie wpisać help (module). To daje szczegóły, takie jak nazwa, plik, moduł Docs, opis 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

 11
Author: Vijay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-17 12:49:20

Nowość w Pythonie 3.2, możesz teraz używać np. code_info() z modułu dis: http://docs.python.org/dev/whatsnew/3.2.html#dis

 10
Author: Tom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-23 10:56:12

Sprawdź to nifty" cdp " polecenie aby cd do katalogu zawierającego źródło dla wskazanego modułu Pythona:

cdp () {
  cd "$(python -c "import os.path as _, ${1}; \
    print _.dirname(_.realpath(${1}.__file__[:-1]))"
  )"
}
 8
Author: Daryl Spitzer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-08 22:25:58

Oto jedna linijka, aby uzyskać nazwę pliku dla modułu, odpowiednią do aliasingu powłoki:

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

Skonfigurowany jako alias:

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

Do użycia:

$ 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
Author: Ernest,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-02 09:19:41

W systemie windows możesz znaleźć lokalizację modułu Pythona, jak pokazano poniżej: tj. Tutaj wpisz opis obrazka

 4
Author: Dun0523,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-09 10:04:36

Na Ubuntu 12.04, na przykład pakiet numpy dla python2, można znaleźć pod adresem:

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

Oczywiście, nie jest to ogólna odpowiedź

 3
Author: nexayq,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-22 14:18:30

Nie wszystkie moduły Pythona są napisane w Pythonie. Datetime jest jednym z nich, który nie jest, a (na Linuksie) jest datetime.so.

Musisz pobrać kod źródłowy do standardowej biblioteki Pythona, aby się do niego dostać.

 0
Author: JimB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-30 13:43:55

Dla tych, którzy preferują rozwiązanie GUI: jeśli używasz gui takiego jak Spyder (część instalacji Anaconda), możesz po prostu kliknąć prawym przyciskiem myszy nazwę modułu (np. " csv "w" Importuj csv") i wybrać "przejdź do definicji" - otworzy to plik, ale także na górze możesz zobaczyć dokładną lokalizację pliku ("C:....csv.py")

 0
Author: Alona Levy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-01 14:00:13

Możesz zobaczyć źródło bezpośrednio z repozytorium git . Na przykład tutaj jest datetime module i jako bonus, subprocess module.

Jeśli poszperasz więcej, możesz znaleźć tradycyjną implementację standardowego interpretera Pythona, który jest napisany w 'C' i nazywany również 'CPython'

 -1
Author: brother-bilo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-02 13:02:29