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

478

Jak się dowiedzieć, gdzie jest zainstalowany plik źródłowy dla danego modułu Python? Czy metoda jest inna w systemie Windows niż w systemie Linux?

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

Daryl Spitzer
źródło

Odpowiedzi:

375

Dla czystego modułu pythonowego możesz znaleźć źródło, patrząc na themodule.__file__. Moduł datetime jest jednak napisany w C i dlatego datetime.__file__wskazuje na plik .so (nie ma go datetime.__file__w systemie Windows), dlatego nie można zobaczyć źródła.

Jeśli pobierzesz archiwum źródłowe Pythona i rozpakujesz go, kod modułów można znaleźć 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

Najnowszą wersję Mercurial można również znaleźć w Internecie pod adresem https://hg.python.org/cpython/file/tip/Modules/_datetimemodule.c

Moe
źródło
Jeśli edytujesz swoją odpowiedź, aby wskazać, że plik .__ data__ wskazuje na .so w systemie Linux i Mac OS X (chociaż w systemie Windows obiekt modułu datetime nie ma atrybutu pliku ), zaakceptuję twoją odpowiedź.
Daryl Spitzer
W rzeczywistości w systemie Windows (przynajmniej w wersji, której używam), datetime po prostu nie ma atrybutu pliku .
Daryl Spitzer
220

Uruchomienie python -vz wiersza poleceń powinno powiedzieć, co jest importowane i skąd. Działa to dla mnie w systemach 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, jakie te złe mtime są w mojej instalacji!

jblocksom
źródło
8
Fajne! Możesz także wpisać swoją własną instrukcję importu po otwarciu w trybie interaktywnym, aby zobaczyć, skąd pochodzi określona biblioteka.
scorpiodawg
3
Gdzie są built-inmoduły?
loretoparisi,
120

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

Właściwym sposobem na to jest nigdy __file__lub próba przejścia sys.pathi szukania siebie itp. (Chyba że musisz być kompatybilny wstecz niż 2.1).

To inspectw szczególności moduł getfilelubgetsourcefile .

Chyba, że ​​chcesz nauczyć się i wdrażać reguły (które są udokumentowane, ale bolesne dla CPython 2.x, i wcale nie udokumentowane dla innych implementacji lub 3.x) dotyczące mapowania .pycdo .pyplików; radzenie sobie z archiwami .zip, jajami i pakietami modułów; wypróbowanie różnych sposobów uzyskania ścieżki do .so/ .pydplików, które nie obsługują __file__; zastanawianie się, co robią Jython / IronPython / PyPy; itp. W takim przypadku idź.

Tymczasem źródło każdej wersji Pythona od 2.0+ jest dostępne online pod adresem http://hg.python.org/cpython/file/X.Y/(np. 2.7 lub 3.3 ). Kiedy więc odkryjesz, że inspect.getfile(datetime)jest to plik .solub , możesz sprawdzić go w katalogu Modules. Ściśle mówiąc, nie ma sposobu, aby mieć pewność, który określa, jakie moduł, ale prawie wszystkie z nich są albo plik albo , więc nie powinno być trudno się domyślić, że datetimemodule.c to, co chcesz..pyd/usr/local/lib/python2.7/lib-dynload/datetime.sofoo.cfoomodule.c

abarnert
źródło
3
Dlaczego __file__nie ma zastosowania do niewbudowanych? Rozumiem, gdzie przeszukiwanie sys.path może być bolesne (zwłaszcza bez wiedzy o meta_path), ale czy martwisz się o przestrzeń nazw między __file__definicjami a plikami binarnymi?
1
Robię to w wersji 2.7.8 w trybie datetime i po prostu otrzymuję błąd TypeError zarówno dla getfile, jak i getsourcefile. Osobiście mam wiele wersji Pythona i muszę wiedzieć, na którą wersję datetimemodule.c jest wskazywana, ponieważ teraz wiem, że nie jest wskazana na tę, na którą powinna być wskazywana, biorąc pod uwagę działającą wersję interpretera ...
mmitchell
1
@mmitchell: Jeśli otrzymujesz błąd TypeError z inspect.getfile (datetime), zakładając, że datetime jest tak naprawdę modułem, a nie czymś innym, co przypisałeś tej samej nazwie, jestem pewien, że oznacza to, że stworzyłeś niestandardową kompilację statycznie link w datetime do interpretera zamiast uczynić go modułem ładowalnym. Ale mogą być inne powody, o których nie myślałem. Musisz zadać nowe pytanie i podać o wiele więcej informacji, aby je odtworzyć.
abarnert
@mmitchell: Tymczasem nie ma sposobu, aby dowiedzieć się, na którą wersję pliku datetimemodule.c wskazuje, ponieważ nie wskazuje on pliku datetimemodule.c, wskazuje na skompilowany moduł zbudowany z tego pliku C. plik C może nie istnieć w twoim systemie, mógł być edytowany, odkąd go skompilowałeś, cokolwiek.
abarnert
@tristan: Nie jestem pewien, czy rozumiem, o co pytasz, ale może to na to odpowie: Kiedykolwiek __file__działa, inspect.getfiledziała; nie ma sytuacji, w której zgadywanie, czy użyć, __file__będzie lepsze niż użycie modułu inspekcji.
abarnert
67

sys.pathLista zawiera listę katalogów, które będą wyszukiwane modułów w czasie pracy:

python -v
>>> import sys
>>> sys.path
['', '/usr/local/lib/python25.zip', '/usr/local/lib/python2.5', ... ]
Greg Hewgill
źródło
10
python -c 'import sys; print "\n".join(sys.path)'pozwoli ci to zobaczyć bez konieczności wchodzenia w interaktywny python.
Joe Block
6
Python 3:python -c 'import sys; print("\n".join(sys.path))'
arudzinska
61

Jeśli używasz pip do instalacji modułów, pip show $modulezwracana jest tylko lokalizacja.

James Mark Mackenzie
źródło
10
(Myślę, że $modulemiała to być zmienna zastępcza, a nie dosłownie to, co byśmy wpisali. Np. m=numpy; pip show $m... itd. Dla każdego m)
Michał
należy to zaznaczyć jako najdokładniejszą odpowiedź na zadane pytanie.
Rahul Goyal
37

ze standardowej biblioteki wypróbuj 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))
Codespaced
źródło
1
To jest fantastyczne. Byłbym apt-get removeDataDog i nadal mogłem go zaimportować. Pomogło mi to znaleźć pliki (więc mogłem je usunąć), gdy inne rozwiązania nie pomogły.
sg
w przypadku python3.x imppakiet jest przestarzały (od wersji 3.4) na korzyść importlib(od wersji 3.1) docs.python.org/3.6/library/imp.html
Michael
Teraz musisz użyć go w ten sposób dla Python3. import importlibpotemimportlib.util.find_spec('fontTools')
Medhat
33

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

W przypadku modułów pochodzących z .py(lub .pyc) plików możesz użyć mymodule.__file__np

> import random
> random.__file__
'C:\\Python25\\lib\\random.pyc'
Bjarke Ebert
źródło
12

W interpreterie Pythona można zaimportować konkretny moduł, a następnie wpisać help (module). Daje to takie szczegóły, jak nazwa, plik, dokumenty modułu, opis i in.

Dawny:

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'

i in

Vijay
źródło
To dało mi pełną ścieżkę do pliku modułu, podczas gdy inne odpowiedzi podały tylko ścieżki względne. Dzięki.
Jerther,
12

Oto jeden linijka do pobrania nazwy pliku modułu, odpowiedni do aliasingu powłoki:

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

Ustaw jako alias:

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

Używać:

$ getpmpath twisted
/usr/lib64/python2.6/site-packages/twisted/__init__.pyc
$ getpmpath twisted.web
/usr/lib64/python2.6/site-packages/twisted/web/__init__.pyc
Ernest
źródło
9

Sprawdź tę fajną komendę „cdp”, aby cd do katalogu zawierającego źródło wskazanego modułu Python:

cdp () {
  cd "$(python -c "import os.path as _, ${1}; \
    print _.dirname(_.realpath(${1}.__file__[:-1]))"
  )"
}
Daryl Spitzer
źródło
Dzięki! Właśnie tego szukałem. Dziwne, że nie zawarliby czegoś takiego w dystrybucji Pythona.
Antony Hatchkins
9

W systemie Windows można znaleźć lokalizację modułu python, jak pokazano poniżej: tzn. Znajdź moduł rest_framework wprowadź opis zdjęcia tutaj

Dun0523
źródło
4

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ź

nexayq
źródło
0

Nie wszystkie moduły Pythona są napisane w języku Python. Zdarza się, że Datetime jest jednym z nich, a nie (i na Linuksie) to datetime.so.

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

JimB
źródło
2
Daryl: Źle zrozumiałeś odpowiedź Jima: „Datetime jest jednym z modułów Pythona, który nie jest napisany w Pythonie”.
Matthew Trevor
0

Dla tych, którzy wolą rozwiązanie GUI: jeśli używasz GUI, takiego jak Spyder (część instalacji Anaconda), wystarczy kliknąć prawym przyciskiem myszy nazwę modułu (np. „Csv” w „import csv”) i wybrać „przejdź do definicji ”- spowoduje to otwarcie pliku, ale także u góry możesz zobaczyć dokładną lokalizację pliku („ C: .... csv.py ”)

Alona
źródło
0

Jeśli nie używasz interpretera, możesz uruchomić poniższy kod:

import site
print (site.getsitepackages())

Wynik:

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

Drugim elementem w tablicy będzie lokalizacja paczki. W tym przypadku:

C:\Users\<your username>\AppData\Local\Programs\Python\Python37\lib\site-packages
sudhee
źródło
0

Innym sposobem sprawdzenia, czy masz zainstalowanych wiele wersji Pythona, z terminala.

-MBP: ~ python3 -m pip pokaż pyperclip

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

MBP: ~ python -m pip show pyperclip

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

u_v
źródło
-1

W środowisku IDE, takim jak Spyder, zaimportuj moduł, a następnie uruchom moduł indywidualnie. wprowadź opis zdjęcia tutaj

Anirudh Sharma
źródło
Import i wydruk str()modelu to dokładniejszy opis tego, co robisz na zrzucie ekranu, a IDE wydaje się nieistotne dla tego rozwiązania
myszka
2
Witamy w StackOverflow! Proszę nie pisać kodu przy użyciu zdjęć. Obrazy są trudne do odczytania, nie mogą być wyszukiwane i nie są widoczne dla niektórych czytelników. Zamiast tego proszę podać odpowiedni kod bezpośrednio w treści odpowiedzi.
Brian