Как мне найти расположение исходников модуля Python? - PullRequest
428 голосов
/ 06 ноября 2008

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

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

Ответы [ 15 ]

337 голосов
/ 06 ноября 2008

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

Если вы скачаете архив с исходным кодом Python и распакуете его, код модулей можно найти в подкаталоге Modules .

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

Python-2.6/Modules/datetimemodule.c

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

204 голосов
/ 06 ноября 2008

Запуск 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 на моей установке!

108 голосов
/ 15 декабря 2012

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

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

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

Если вы не хотите изучать и реализовывать правила (которые задокументированы, но болезненны для CPython 2.x и совсем не документированы для других реализаций или 3.x) для сопоставления .pyc с .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 или .pyd, такой как /usr/local/lib/python2.7/lib-dynload/datetime.so, вы можете найти его в каталоге Modules. Строго говоря, нет никакого способа быть уверенным в том, какой файл определяет какой модуль, но почти все они являются foo.c или foomodule.c, поэтому нетрудно догадаться, что datetimemodule.c это то, что вы хотите.

58 голосов
/ 06 ноября 2008

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

python -v
>>> import sys
>>> sys.path
['', '/usr/local/lib/python25.zip', '/usr/local/lib/python2.5', ... ]
45 голосов
/ 25 сентября 2015

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

29 голосов
/ 04 мая 2013

из стандартной библиотеки попробуйте 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))
28 голосов
/ 06 ноября 2008

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

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

> import random
> random.__file__
'C:\\Python25\\lib\\random.pyc'
12 голосов
/ 21 апреля 2011

В интерпретаторе python вы можете импортировать конкретный модуль и затем ввести help (module). Это дает такие данные, как имя, файл, документы по модулю, описание и др.

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'

и др.

10 голосов
/ 23 февраля 2011

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

9 голосов
/ 27 апреля 2010

Проверьте эту отличную команду "cdp" для перехода в каталог, содержащий исходный код для указанного модуля Python:

cdp () {
  cd "$(python -c "import os.path as _, ${1}; \
    print _.dirname(_.realpath(${1}.__file__[:-1]))"
  )"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...