Как найти местоположение источников модулей Python?

Как узнать, где установлен исходный файл для данного модуля Python? Отличается ли метод в Windows от Linux?

Я пытаюсь найти источник datetime модуль в частности, но меня интересует и более общий ответ.

16 ответов


для чистого модуля python вы можете найти источник, посмотрев на themodule.__file__. Однако модуль datetime написан на C, и поэтому datetime.__file__ указывает на a .Итак файл (нет datetime.__file__ в Windows), и поэтому вы не можете увидеть источник.

если вы загрузите исходный tarball python и извлеките его, код модулей можно найти в модули поддиректории.

например, если вы хотите найти код datetime для python 2.6, вы можете посмотреть at

Python-2.6/Modules/datetimemodule.c

вы также можете найти последнюю версию Mercurial в интернете по адресу https://hg.python.org/cpython/file/tip/Modules/_datetimemodule.c


под управлением python -v из командной строки должно сообщить вам, что импортируется и откуда. Это работает для меня в Windows и 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
...

Я не уверен, что эти плохие mtime находятся на моей установке!


я понимаю, что этот ответ опоздал на 4 года, но существующие ответы вводят в заблуждение людей.

правильный способ сделать это никогда не __file__, или пытается пройти через sys.path и поиск себя, и т. д. (если вам не нужно быть обратно совместимым за пределами 2.1).

это inspect модуль-в частности, getfile или getsourcefile.

если вы не хотите изучать и внедрять правила (которые документированы, но болезненны для CPython 2.x, и не документировано вообще для других реализаций или 3.x) для отображения .pyc to .py файлы; дело .zip-архивы, яйца и пакеты модулей; пытаясь разными способами получить путь к .so/.pyd файлы, которые не поддерживают __file__; выяснение того, что делают Jython/IronPython/PyPy; и т. д. В таком случае, вперед.

между тем, источник каждой версии Python от 2.0+ доступен в интернете по адресу http://hg.python.org/cpython/file/X.Y/ (например, 2.7 или 3.3). Вот однажды вы обнаружите, что inspect.getfile(datetime) это .so или как /usr/local/lib/python2.7/lib-dynload/datetime.so, вы можете посмотреть в каталоге модулей. Строго говоря, нет способа быть уверенным в том, какой файл определяет, какой модуль, но почти все они либо foo.c или foomodule.c, так что нетрудно догадаться, что datetimemodule.c это то, что вы хотите.


на sys.path список содержит список каталогов, в которых будет производится поиск модулей во время выполнения:

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

Если вы используете pip для установки модулей, просто pip show $module место возвращается.


datetime является встроенным модулем, поэтому исходного файла (Python) нет.

для модулей, поступающих из .py (или .pyc) файлов, вы можете использовать mymodule.__file__, например,

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

из стандартной библиотеки попробовать чертенок.find_module

>>> import imp
>>> imp.find_module('fontTools')
(None, 'C:\Python27\lib\site-packages\FontTools\fontTools', ('', '', 5))
>>> imp.find_module('datetime')
(None, 'datetime', ('', '', 6))

в интерпретаторе python вы можете импортировать конкретный модуль, а затем ввести help (module). Это дает подробную информацию, такую как имя, файл, модуль Docs, описание 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


новое в Python 3.2, теперь вы можете использовать, например,code_info() из модуля dis: http://docs.python.org/dev/whatsnew/3.2.html#dis


зацените отличная команда "cdp" на cd в каталог, содержащий источник для указанного модуля Python:

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

вот однострочный файл, чтобы получить имя файла для модуля, подходящего для сглаживания оболочки:

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

настройка в качестве псевдонима:

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

использование:

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

в windows вы можете найти расположение модуля python, как показано ниже: i.e найти модуль rest_framework enter image description here


на Ubuntu 12.04, например, пакет numpy для python2, можно найти по адресу:

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

конечно, это не универсальный ответ


Не все модули python написаны на python. Datetime является одним из них, которого нет, и (в linux) является datetime.Итак.

вам нужно будет загрузить исходный код в стандартную библиотеку python, чтобы добраться до него.


для тех, кто предпочитает решение GUI: если вы используете gui, такой как Spyder (часть установки Anaconda), вы можете просто щелкнуть правой кнопкой мыши имя модуля (например, "csv" в "import csv") и выбрать "перейти к определению" - это откроет файл, но также сверху вы можете увидеть точное местоположение файла ("C:....csv.py)


вы можете увидеть источник прямо из репозиторий git. Например, вот модуль datetime и в качестве бонуса,модуль подпроцесс.

Если вы сделаете больше копания вокруг, вы можете найти традиционную реализацию стандартного интерпретатора Python, который написан на "C", а также называется 'CPython'