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ź.

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


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!


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


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

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.


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

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'

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


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


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

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


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ź


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ć.


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


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

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


-1

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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.