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


481

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

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

Ответы:


375

Для чистого модуля 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.


Если вы измените свой ответ, указав, что datetime .__ file__ указывает на .so в Linux и Mac OS X (хотя в Windows объект модуля datetime не имеет атрибута файла ), я приму ваш ответ.
Дэрил Спитцер

На самом деле в Windows (по крайней мере, в той версии, которую я использую), datetime просто не имеет атрибута файла .
Дэрил Спитцер

221

Запуск 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 на моей установке!


8
Круто! Вы также можете ввести свой собственный конкретный оператор импорта после того, как он откроется в интерактивном режиме, чтобы увидеть, откуда исходит конкретная библиотека.
scorpiodawg

3
Где находятся built-inмодули?
loretoparisi

120

Я понимаю, что этот ответ опоздал на 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 - это то, что вам нужно.


3
Почему это __file__не относится к не встроенным? Я понимаю, где сканирование sys.path может быть болезненным (особенно без знания meta_path), но беспокоит ли вас вопрос пространства имен между __file__определениями и двоичными файлами?

1
Я делаю это в 2.7.8 для datetime и просто получаю TypeError как для getfile, так и getsourcefile. Лично у меня установлено несколько версий python, и мне нужно знать, на какую версию datetimemodule.c он указывает, потому что сейчас я знаю, что он не указывает на ту, на которую следует указывать, учитывая версию интерпретатора, которая работает ...
mmitchell

1
@mmitchell: Если вы получаете TypeError из inspect.getfile (datetime), предполагая, что datetime на самом деле является модулем, а не чем-то еще, что вы присвоили тому же имени, я уверен, что это означает, что вы сделали пользовательскую сборку для статически связывать в datetime с интерпретатором вместо того, чтобы делать его загружаемым модулем. Но могут быть и другие причины, о которых я не задумывался. Вам нужно задать новый вопрос и дать гораздо больше информации, чтобы воспроизвести это.
abarnert

@mmitchell: Между тем, нет никакого способа узнать, на какую версию datetimemodule.c он указывает, поскольку он не указывает на datetimemodule.c, он указывает на скомпилированный модуль, созданный из этого файла C; файл C может не существовать в вашей системе, возможно, он был отредактирован с момента его компиляции.
abarnert

@tristan: Я не уверен, что понимаю, что вы спрашиваете, но, возможно, это ответит на это: всякий раз __file__, когда работает, inspect.getfileработает; не бывает ситуации, когда угадывать, __file__будет ли это лучше, чем просто использовать модуль inspect.
abarnert

67

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

python -v
>>> import sys
>>> sys.path
['', '/usr/local/lib/python25.zip', '/usr/local/lib/python2.5', ... ]

10
python -c 'import sys; print "\n".join(sys.path)'позволит вам просмотреть его без необходимости заходить в интерактивный питон.
Джо Блок

6
Питон 3:python -c 'import sys; print("\n".join(sys.path))'
arudzinska

61

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


10
(Я думаю, $moduleчто это была переменная-заполнитель, а не буквально то, что можно было бы напечатать. Например, m=numpy; pip show $m… и т. Д. Для любого m)
Майкл

это следует пометить как наиболее точный ответ на заданный вопрос.
Рахул Гоял

37

из стандартной библиотеки попробуйте 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))

1
Это фантастика. Я бы apt-get removeDataDog и все еще мог импортировать его. Это помогло мне найти, где находятся файлы (чтобы я мог их удалить), когда другие решения не помогли.
ГГ ,

для python3.x impпакет устарел (начиная с версии 3.4) в пользу importlib(начиная с версии 3.1) docs.python.org/3.6/library/imp.html
Майкл

Теперь вам нужно использовать его таким образом для python3. import importlibзатемimportlib.util.find_spec('fontTools')
Medhat

34

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

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

> import random
> random.__file__
'C:\\Python25\\lib\\random.pyc'

12

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

и другие


Это дало мне полный путь к файлу модуля, в то время как другие ответы дали только относительные пути. Спасибо.
Джертер

12

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

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


9

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

cdp () {
  cd "$(python -c "import os.path as _, ${1}; \
    print _.dirname(_.realpath(${1}.__file__[:-1]))"
  )"
}

Спасибо! Это именно то, что я искал. Достаточно странно, что они не включили бы что-то подобное в дистрибутив питона.
Энтони Хэтчкинс

9

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


4

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

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

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


0

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

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


2
Дэрил: Вы ошиблись в ответе Джима: «Datetime оказывается одним из модулей python, не написанных на python».
Мэтью Тревор

0

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


0

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

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

0

Другой способ проверить, установлено ли у вас несколько версий Python из терминала.

-MBP: ~ python3 -m pip show 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


-1

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


Импорт и распечатка str()модели - более точное описание того, что вы делаете на скриншоте, плюс IDE кажется неуместным для этого решения
мышиный хвост

2
Добро пожаловать в StackOverflow! Пожалуйста, не размещайте код, используя изображения. Изображения трудно читать, их нельзя найти, и некоторые читатели их не видят. Вместо этого, пожалуйста, включите любой соответствующий код непосредственно в текст вашего ответа.
Брайан
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.