Як дізнатися, де встановлений вихідний файл для даного модуля 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 removeDataDog і можу його ще імпортувати. Це допомогло мені знайти місця, де були файли (щоб я міг їх видалити), коли інші рішення не допомогли.
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 здається неактуальним для цього рішення