Как найти местоположение источников модулей 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', ... ]
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
на 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'