Как мне найти расположение источников модуля Python?

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

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


person Daryl Spitzer    schedule 06.11.2008    source источник


Ответы (19)


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

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

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

Python-2.6/Modules/datetimemodule.c

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

person Moe    schedule 06.11.2008
comment
Если вы отредактируете свой ответ, указав, что datetime .__ file__ указывает на .so в Linux и Mac OS X (хотя в Windows объект модуля datetime не имеет атрибута file), я приму ваш ответ. - person Daryl Spitzer; 06.11.2008
comment
На самом деле в Windows (по крайней мере, в той версии, которую я использую) datetime просто не имеет атрибута file. - person Daryl Spitzer; 06.11.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 на моей установке!

person jblocksom    schedule 06.11.2008
comment
Прохладный! Вы также можете ввести свой собственный конкретный оператор импорта после его открытия в интерактивном режиме, чтобы увидеть, откуда берется конкретная библиотека. - person scorpiodawg; 19.07.2012
comment
Где built-in модули? - person loretoparisi; 05.04.2016

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

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

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

Если вы не хотите изучить и реализовать правила (которые документированы, но болезненны для CPython 2.x и совсем не документированы для других реализаций или 3.x) для сопоставления .pyc с .py файлами; работа с архивами .zip, яйцами и пакетами модулей; пробовать разными способами получить путь к _8 _ / _ 9_ файлам, не поддерживающим __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 - это то, что вам нужно.

person abarnert    schedule 15.12.2012
comment
Почему is __file__ неприменимо для не встроенных функций? Я понимаю, где сканирование sys.path может быть болезненным (особенно, если вы не знаете о meta_path), но вас беспокоит пространство имен между определениями __file__ и двоичными файлами? - person ; 06.01.2015
comment
Я делаю это в 2.7.8 в datetime и просто получаю TypeError как для getfile, так и для getsourcefile. Лично у меня установлено несколько версий python, и мне нужно знать, КАКАЯ версия datetimemodule.c, на которую он указывает, потому что сейчас я знаю, что он не указывает на тот, на который он должен указывать, учитывая версию интерпретатора, которая работает ... - person mmitchell; 03.04.2015
comment
@mmitchell: если вы получаете ошибку TypeError из inspect.getfile (datetime), предполагая, что datetime на самом деле является модулем, а не чем-то еще, что вы присвоили с тем же именем, я почти уверен, что это означает, что вы создали пользовательскую сборку для статически привязывать datetime к интерпретатору вместо того, чтобы делать его загружаемым модулем. Но могут быть и другие причины, о которых я не подумал. Вам нужно задать новый вопрос и дать гораздо больше информации, чтобы воспроизвести это. - person abarnert; 04.04.2015
comment
@mmitchell: Между тем, нет способа узнать, на какую версию datetimemodule.c он указывает, потому что он указывает не на datetimemodule.c, а на скомпилированный модуль, созданный из этого файла C; файл C может не существовать в вашей системе, возможно, он был отредактирован с тех пор, как вы его скомпилировали, независимо от того. - person abarnert; 04.04.2015
comment
@tristan: Я не уверен, что понимаю, о чем вы спрашиваете, но, возможно, это ответит на него: всякий раз, когда __file__ работает, inspect.getfile работает; Нет ситуации, когда угадать, использовать ли __file__ будет лучше, чем просто использовать модуль inspect. - person abarnert; 04.04.2015
comment
IIRC, когда я писал это, я думаю, что комментировал тот факт, что вы говорите людям всегда избегать простого использования __file__ или небольшого взгляда. - person ; 04.04.2015
comment
Да, я знаю, как работает компиляция, я использовал .c для согласованности с вашим ответом. ;) Я тоже не ожидал полного решения своей проблемы, просто указал, что ваш ответ не работает. Я тестировал чистую, ванильную установку 2.7.8 и получил ошибку, так что она не имеет ничего общего с пользовательскими вещами - она ​​просто не работает в Windows. - person mmitchell; 06.04.2015
comment
@mmitchell: Вы правы, Windows - отстой, по крайней мере, для Python 2.x. Насколько я могу судить, заглянув под капот, информация вообще недоступна. В 3.4 легко найти файл, который будет импортирован с помощью import foo (при условии, что это действительно файл, а не, скажем, член zip-архива), что почти всегда верно (если вы, скажем, не отредактировали sys. path после импорта), но в 2.7 этого не существует, и подделать его сложно и не очень надежно. - person abarnert; 08.04.2015
comment
@mmitchell: Одна вещь, которая должна работать, но я не хочу ее кодировать. :) HANDLE к DLL хранится внутри объекта на уровне C API, и вы можете запросить Win32 для путей и дескрипторов DLL, поэтому с ctypes.pythonapi и pywin32 это должно быть выполнимо. (Похоже, что файлы .pyd внутри архивов .zip загружаются путем распаковки их во временное место, так что это то, что вы, вероятно, получите для чего угодно, кроме простого импорта; не уверен, насколько это полезно, но ...) - person abarnert; 08.04.2015

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

person James Mark Mackenzie    schedule 25.09.2015
comment
(Я думаю, что $module был задуман как переменная-заполнитель, а не буквально то, что нужно было бы ввести. Например, m=numpy; pip show $m ... и т. Д. Для любого m) - person michael; 16.09.2018
comment
это должно быть отмечено как наиболее точный ответ на заданный вопрос. - person Rahul Goyal; 20.03.2020

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

python -v
>>> import sys
>>> sys.path
['', '/usr/local/lib/python25.zip', '/usr/local/lib/python2.5', ... ]
person Greg Hewgill    schedule 06.11.2008
comment
python -c 'import sys; print "\n".join(sys.path)' позволит вам просматривать его, не переходя в интерактивный питон. - person Joe Block; 19.09.2014
comment
Python 3: python -c 'import sys; print("\n".join(sys.path))' - person arudzinska; 13.09.2018

из стандартной библиотеки попробуйте 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))
person Codespaced    schedule 04.05.2013
comment
Это фантастика. Я apt-get remove использовал DataDog и все еще мог импортировать его. Это помогло мне найти, где были файлы (чтобы я мог их удалить), когда другие решения не помогли. - person s g; 14.05.2015
comment
для python3.x пакет imp устарел (начиная с версии 3.4) в пользу importlib (начиная с 3.1) docs.python.org/3.6/library/imp.html - person michael; 16.09.2018
comment
Теперь вам нужно использовать его таким образом для python3. import importlib, затем importlib.util.find_spec('fontTools') - person Medhat; 28.01.2020

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

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

> import random
> random.__file__
'C:\\Python25\\lib\\random.pyc'
person Bjarke Ebert    schedule 06.11.2008

Вот однострочный файл, чтобы получить имя файла для модуля, подходящего для псевдонима оболочки:

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
person Ernest    schedule 04.03.2013
comment
Первая версия неправильная, слишком много обратных косых черт. Из сценария оболочки это работает для меня: echo 'import sys; t=__import__(sys.argv[1],fromlist=["."]); print(t.__file__)' | python - "$@" - person Metamorphic; 13.11.2020

В интерпретаторе 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'

et al

person Vijay    schedule 21.04.2011
comment
Это дало мне полный путь к файлу модуля, в то время как другие ответы давали только относительные пути. Спасибо. - person Jerther; 10.03.2017

В Windows вы можете найти расположение модуля python, как показано ниже: т.е. найдите модуль rest_framework введите описание изображения здесь

person Dun0523    schedule 09.06.2014

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

person Tom    schedule 23.02.2011

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

cdp () {
  cd "$(python -c "import os.path as _, ${1}; \
    print _.dirname(_.realpath(${1}.__file__[:-1]))"
  )"
}
person Daryl Spitzer    schedule 27.04.2010
comment
Спасибо! Это именно то, что я искал. Как ни странно, они не стали включать что-то подобное в дистрибутив python. - person Antony Hatchkins; 30.11.2010

В Ubuntu 12.04, например, пакет numpy для python2 можно найти по адресу:

/usr/lib/python2.7/dist-packages/numpy

Конечно, это не общий ответ

person nexayq    schedule 22.06.2016

Просто обновляю ответ на случай, если он кому-то сейчас понадобится, я использую Python 3.9 и использую Pip для управления пакетами. Просто используйте pip show, например:

pip show numpy

Он предоставит вам все сведения о том, где pip хранит все ваши другие пакеты.

person Ritik Attri    schedule 01.06.2021

Другой способ проверить, установлено ли у вас несколько версий 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

person u_v    schedule 08.04.2020

Не все модули python написаны на python. Datetime является одним из них, которого нет, и (в Linux) это datetime.so.

Вам нужно будет загрузить исходный код в стандартную библиотеку Python, чтобы получить его.

person JimB    schedule 06.11.2008
comment
Дэрил: Вы неправильно проанализировали ответ Джима. Datetime оказался одним из модулей Python, написанных не на Python. - person Matthew Trevor; 07.11.2008

Для тех, кто предпочитает решение с графическим интерфейсом: если вы используете графический интерфейс, такой как Spyder (часть установки Anaconda), вы можете просто щелкнуть правой кнопкой мыши имя модуля (например, «csv» в «импортировать csv») и выбрать «перейти. до определения "- это откроет файл, но также вверху вы увидите точное местоположение файла (" C: .... csv.py ")

person Anon    schedule 01.12.2014

Если вы не используете интерпретатор, вы можете запустить приведенный ниже код:

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
person sudhee    schedule 27.01.2020

В такой среде IDE, как Spyder, импортируйте модуль, а затем запустите модуль по отдельности. введите здесь описание изображения

person Anirudh Sharma    schedule 06.04.2020
comment
Импортировать и распечатать str() модели - это более точное описание того, что вы делаете на скриншоте, плюс IDE кажется неуместной для этого решения. - person mousetail; 06.04.2020
comment
Добро пожаловать в StackOverflow! Пожалуйста, не размещайте код с изображениями. Изображения трудно читать, в них невозможно выполнить поиск, и некоторые читатели не могут их просмотреть. Вместо этого, пожалуйста, включите любой соответствующий код прямо в текст вашего ответа. - person Brian; 06.04.2020