Как узнать, где установлен исходный файл для данного модуля Python? Этот метод отличается от Windows, чем Linux?
Я пытаюсь найти источник модуля datetime
в частности, но мне интересен и более общий ответ.
Как узнать, где установлен исходный файл для данного модуля Python? Этот метод отличается от Windows, чем Linux?
Я пытаюсь найти источник модуля datetime
в частности, но мне интересен и более общий ответ.
Для чистого модуля python вы можете найти источник, посмотрев themodule.__file__
.
Однако модуль datetime написан на C, поэтому datetime.__file__
указывает на .so файл (в Windows нет datetime.__file__
), и поэтому вы не можете видеть источник.
Если вы загружаете исходный tar файл python и извлекаете его, код модуля можно найти в подкаталоге Модули.
Например, если вы хотите найти код datetime для python 2.6, вы можете посмотреть
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
...
Я не уверен, что такое плохое время в моей установке!
Я понимаю, что этот ответ опоздал на 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
или .pyd
файлом, например /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'
из стандартной библиотеки попробуйте 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))
Если вы используете pip для установки ваших модулей, просто pip show $module
возвращается местоположение.
Новое в Python 3.2, теперь вы можете использовать, например. code_info()
из модуля dis:
http://docs.python.org/dev/whatsnew/3.2.html#dis
В интерпретаторе python вы можете импортировать конкретный модуль, а затем ввести help (module). Это дает такие данные, как имя, файл, документы модулей, описание и др.
Пример:
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
Отметьте эту отличную команду cdp для cd в каталог, содержащий источник для указанного модуля Python:
cdp () {
cd "$(python -c "import os.path as _, ${1}; \
print _.dirname(_.realpath(${1}.__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 - "
Для использования:
[[email protected] ~]$ getpmpath twisted
/usr/lib64/python2.6/site-packages/twisted/__init__.pyc
[[email protected] ~]$ getpmpath twisted.web
/usr/lib64/python2.6/site-packages/twisted/web/__init__.pyc
В окнах вы можете найти расположение модуля python, как показано ниже: я найдем модуль rest_framework
Не все модули python написаны на python. Datetime, случается, является одним из них, которого нет, и (по linux) является datetime.so.
Вам нужно будет загрузить исходный код в стандартную библиотеку python, чтобы получить его.
Для тех, кто предпочитает GUI-решение: если вы используете gui, например Spyder (часть установки Anaconda), вы можете просто щелкнуть правой кнопкой мыши имя модуля (например, "csv" в "import csv" ) и выберите "перейти к определению" - это откроет файл, но также в верхней части вы увидите точное местоположение файла ( "C:.... csv.py" )
В Ubuntu 12.04, например, пакет numpy для python2, можно найти по адресу:
/usr/lib/python2.7/dist-packages/numpy
Конечно, это не общий ответ