Как узнать, где установлен исходный файл для данного модуля Python? Отличается ли метод в Windows от Linux?
В частности, я пытаюсь найти источник модуля datetime
, но меня также интересует более общий ответ.
Как узнать, где установлен исходный файл для данного модуля Python? Отличается ли метод в Windows от Linux?
В частности, я пытаюсь найти источник модуля datetime
, но меня также интересует более общий ответ.
Для модуля на чистом 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.
Запуск 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 на моей установке!
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 - это то, что вам нужно.
__file__
неприменимо для не встроенных функций? Я понимаю, где сканирование sys.path может быть болезненным (особенно, если вы не знаете о meta_path), но вас беспокоит пространство имен между определениями __file__
и двоичными файлами?
- person ; 06.01.2015
__file__
работает, inspect.getfile
работает; Нет ситуации, когда угадать, использовать ли __file__
будет лучше, чем просто использовать модуль inspect.
- person abarnert; 04.04.2015
__file__
или небольшого взгляда.
- person ; 04.04.2015
Если вы используете pip для установки модулей, возвращается только pip show $module
местоположение.
$module
был задуман как переменная-заполнитель, а не буквально то, что нужно было бы ввести. Например, m=numpy; pip show $m
... и т. Д. Для любого m
)
- person michael; 16.09.2018
Список sys.path
содержит список каталогов, в которых будет производиться поиск модулей во время выполнения:
python -v
>>> import sys
>>> sys.path
['', '/usr/local/lib/python25.zip', '/usr/local/lib/python2.5', ... ]
python -c 'import sys; print "\n".join(sys.path)'
позволит вам просматривать его, не переходя в интерактивный питон.
- person Joe Block; 19.09.2014
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))
apt-get remove
использовал DataDog и все еще мог импортировать его. Это помогло мне найти, где были файлы (чтобы я мог их удалить), когда другие решения не помогли.
- person s g; 14.05.2015
imp
устарел (начиная с версии 3.4) в пользу importlib
(начиная с 3.1) docs.python.org/3.6/library/imp.html
- person michael; 16.09.2018
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'
Вот однострочный файл, чтобы получить имя файла для модуля, подходящего для псевдонима оболочки:
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
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
В Windows вы можете найти расположение модуля python, как показано ниже: т.е. найдите модуль rest_framework
Новое в Python 3.2, теперь вы можете использовать, например, code_info()
из модуля dis: http://docs.python.org/dev/whatsnew/3.2.html#dis
Ознакомьтесь с этой отличной командой "cdp" для cd в каталог, содержащий исходный код для указанного модуля Python:
cdp () {
cd "$(python -c "import os.path as _, ${1}; \
print _.dirname(_.realpath(${1}.__file__[:-1]))"
)"
}
В Ubuntu 12.04, например, пакет numpy для python2 можно найти по адресу:
/usr/lib/python2.7/dist-packages/numpy
Конечно, это не общий ответ
Просто обновляю ответ на случай, если он кому-то сейчас понадобится, я использую Python 3.9 и использую Pip для управления пакетами. Просто используйте pip show
, например:
pip show numpy
Он предоставит вам все сведения о том, где pip хранит все ваши другие пакеты.
Другой способ проверить, установлено ли у вас несколько версий 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 написаны на python. Datetime является одним из них, которого нет, и (в Linux) это datetime.so.
Вам нужно будет загрузить исходный код в стандартную библиотеку Python, чтобы получить его.
Для тех, кто предпочитает решение с графическим интерфейсом: если вы используете графический интерфейс, такой как Spyder (часть установки Anaconda), вы можете просто щелкнуть правой кнопкой мыши имя модуля (например, «csv» в «импортировать csv») и выбрать «перейти. до определения "- это откроет файл, но также вверху вы увидите точное местоположение файла (" 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
В такой среде IDE, как Spyder, импортируйте модуль, а затем запустите модуль по отдельности. введите здесь описание изображения
str()
модели - это более точное описание того, что вы делаете на скриншоте, плюс IDE кажется неуместной для этого решения.
- person mousetail; 06.04.2020