Как мне найти расположение исходников модуля 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, импортируйте модуль, а затем запустите его по отдельности. введите описание изображения здесь

Другие вопросы по тегам