Как мне найти расположение исходников модуля Python?
Как узнать, где установлен исходный файл для данного модуля Python? В Windows метод отличается от Linux?
Я пытаюсь найти источник datetime
модуля, в частности, но я также заинтересован в более общем ответе.
21 ответ
Для чистого модуля Python вы можете найти источник, посмотрев на themodule.__file__
, Модуль datetime, однако, написан на C, и поэтому datetime.__file__
указывает на файл.so (нет datetime.__file__
на Windows), и, следовательно, вы не можете увидеть источник.
Если вы скачаете архив с исходным кодом Python и распакуете его, код модулей можно найти в подкаталоге Modules.
Например, если вы хотите найти код даты и времени для 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
...
Я не уверен, что эти плохие mtime на моей установке!
Я понимаю, что этот ответ опоздал на 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
Вы можете посмотреть его в каталоге модулей. Строго говоря, нет способа убедиться, какой файл определяет какой модуль, но почти все они foo.c
или же foomodule.c
, поэтому не должно быть трудно догадаться, что datetimemodule.c - это то, что вы хотите.
Если вы используете pip для установки своих модулей, просто pip show $module
местоположение возвращается.
sys.path
list содержит список каталогов, которые будут искать модули во время выполнения:
python -v
>>> import sys
>>> sys.path
['', '/usr/local/lib/python25.zip', '/usr/local/lib/python2.5', ... ]
Из стандартной библиотеки попробуйте 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))
datetime
является встроенным модулем, поэтому исходный файл (Python) отсутствует.
Для модулей из .py
(или же .pyc
) файлы, которые вы можете использовать mymodule.__file__
например,
> import random
> random.__file__
'C:\\Python25\\lib\\random.pyc'
Вот одна строка, чтобы получить имя файла для модуля, подходящего для псевдонимов оболочки:
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, как показано ниже: т.е. найти модуль rest_framework
В интерпретаторе 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'
и другие
Новое в Python 3.2, теперь вы можете использовать, например, code_info()
из модуля dis: http://docs.python.org/dev/whatsnew/3.2.html
Проверьте эту изящную команду "cdp", чтобы перейти к каталогу, содержащему источник для указанного модуля Python:
cdp () {
cd "$(python -c "import os.path as _, ${1}; \
print _.dirname(_.realpath(${1}.__file__[:-1]))"
)"
}
Другой способ проверить, установлено ли у вас несколько версий Python, из терминала.
-MBP: ~ python3 -m pip показать pyperclip
Расположение: /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-
MBP: ~ python -m pip show pyperclip
Расположение: /Users/umeshvuyyuru/Library/Python/2.7/lib/python/site-packages
Просто обновляю ответ на случай, если он кому-то понадобится сейчас, я использую Python 3.9 и использую Pip для управления пакетами. Просто введите это в cmd:-
pip показать любое-имя-модуля-вы-помните-установку
Пример: - pip show numpy
Он предоставит вам все сведения о том, где pip хранит все ваши другие пакеты.
В Ubuntu 12.04, например, пакет numpy для python2, можно найти по адресу:
/usr/lib/python2.7/dist-packages/numpy
Конечно, это не общий ответ
Для тех, кто предпочитает решение с графическим интерфейсом: если вы используете графический интерфейс, такой как Spyder (часть установки Anaconda), вы можете просто щелкнуть правой кнопкой мыши имя модуля (например, "csv" в "import csv") и выбрать "go" к определению "- это откроет файл, но также в верхней части вы можете увидеть точное местоположение файла ("C:....csv.py")
Если вы не используете интерпретатор, вы можете запустить следующий код:
import site
print (site.getsitepackages())
Выход:
['C:\\Users\\<your username>\\AppData\\Local\\Programs\\Python\\Python37', 'C:\\Users\\<your username>\\AppData\\Local\\Programs\\Python\\Python37\\lib\\site-packages']
Второй элемент в массиве будет местоположением вашего пакета. В этом случае:
C:\Users\<your username>\AppData\Local\Programs\Python\Python37\lib\site-packages
Не все модули Python написаны на Python. Datetime оказывается одним из них, которого нет, и (в Linux) это datetime.so.
Вы должны загрузить исходный код в стандартную библиотеку Python, чтобы получить его.
как написано выше, в python просто используйте справку (модуль), т.е.
импортные фракции
помощь(дроби)
если ваш модуль, в примере фракций, установлен, он сообщит вам местоположение и информацию о нем, если он не установлен, он говорит, что модуль недоступен
если он недоступен, он не поставляется по умолчанию с python, и в этом случае вы можете проверить, где вы его нашли, для получения информации о загрузке.
Вы можете увидеть исходный код прямо из репозитория git. Например, вот модуль datetime и, в качестве бонуса, модуль подпроцесса.
Если вы будете больше копаться, то сможете найти традиционную реализацию стандартного интерпретатора Python, который написан на "C" и также называется "CPython".
В такой среде IDE, как Spyder, импортируйте модуль, а затем запустите его по отдельности. введите описание изображения здесь