Як дізнатися, де встановлений вихідний файл для даного модуля Python? Чи відрізняється метод у Windows, ніж у Linux?
Я намагаюся, зокрема, шукати джерело datetime
модуля, але мене також цікавить більш загальна відповідь.
Як дізнатися, де встановлений вихідний файл для даного модуля Python? Чи відрізняється метод у Windows, ніж у Linux?
Я намагаюся, зокрема, шукати джерело datetime
модуля, але мене також цікавить більш загальна відповідь.
Відповіді:
Для чистого модуля python ви можете знайти джерело, переглянувши його themodule.__file__
. Модуль дати, однак, записується на C, а тому datetime.__file__
вказує на файл .so (його немає datetime.__file__
в Windows), і тому ви не можете бачити джерело.
Якщо ви завантажите піктограму пітонного файлу та витягніть його, код модулів можна знайти у підкаталозі Модулі .
Наприклад, якщо ви хочете знайти код часу для 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
модулі?
Я розумію, що ця відповідь запізнюється на 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 - це те, що ви хочете.
__file__
не застосовується для невбудованих? Я розумію, де сканування sys.path може бути болісним (особливо, не знаючи про meta_path), але чи хвилюєтесь ви щодо простору імен між __file__
визначеннями та двійковими файлами ?
__file__
працює, inspect.getfile
працює; немає жодної ситуації, коли здогадка про те, чи використовувати __file__
це буде краще, ніж просто використовувати модуль перевірки.
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)'
дозволить вам переглянути його, не впадаючи в інтерактивний пітон.
python -c 'import sys; print("\n".join(sys.path))'
Якщо ви використовуєте pip для встановлення своїх модулів, просто pip show $module
повертається місцезнаходження.
$module
малася на увазі як змінна заповнювача заповнення, а не в буквальному сенсі, яку можна було б набрати. Наприклад, m=numpy; pip show $m
... і т . Д. Для будь-якого m
)
зі стандартної бібліотеки спробуйте 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 і можу його ще імпортувати. Це допомогло мені знайти місця, де були файли (щоб я міг їх видалити), коли інші рішення не допомогли.
imp
пакет застарілий (оскільки версія 3.4) на користь importlib
(з 3.1) docs.python.org/3.6/library/imp.html
import importlib
потімimportlib.util.find_spec('fontTools')
datetime
є вбудованим модулем, тому вихідного файлу (Python) немає.
Для модулів, що надходять з .py
(або .pyc
) файлів, ви можете використовувати mymodule.__file__
, наприклад,
> import random
> random.__file__
'C:\\Python25\\lib\\random.pyc'
У інтерпретаторі python ви можете імпортувати певний модуль, а потім наберіть довідку (модуль). Це дає детальні відомості, такі як Ім'я, Файл, Документи модулів, Опис та ін.
Наприклад:
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'
та ін
Ось один вкладиш, щоб отримати ім'я файлу для модуля, придатного для згладжування оболонки:
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
Нове в Python 3.2, тепер ви можете використовувати, наприклад, code_info()
з модуля dis:
http://docs.python.org/dev/whatsnew/3.2.html#dis
Перевірте цю вишукану команду "cdp", щоб перейти до каталогу, що містить джерело для вказаного модуля Python:
cdp () {
cd "$(python -c "import os.path as _, ${1}; \
print _.dirname(_.realpath(${1}.__file__[:-1]))"
)"
}
Не всі модулі python записуються в python. Datetime, можливо, є одним із них, що не є, а (в Linux) - datetime.so.
Вам доведеться завантажити вихідний код у стандартну бібліотеку python, щоб отримати доступ до нього.
Для тих, хто вважає за краще рішення GUI: якщо ви використовуєте такий gui, як 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, з терміналу.
-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
У IDE, як Spyder, імпортуйте модуль, а потім запустіть модуль окремо. введіть тут опис зображення
str()
моделі - це більш точний опис того, що ви робите на скріншоті, плюс IDE здається неактуальним для цього рішення