Як знайти місце розташування джерел модуля Python?


479

Як дізнатися, де встановлений вихідний файл для даного модуля Python? Чи відрізняється метод у Windows, ніж у Linux?

Я намагаюся, зокрема, шукати джерело datetimeмодуля, але мене також цікавить більш загальна відповідь.

Відповіді:


375

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


Якщо ви відредагуєте свою відповідь, щоб вказати, що файл .__ date__ вказує на .so в Linux & Mac OS X (хоча в Windows об’єкт модуля date не має атрибуту файлу ), я прийму вашу відповідь.
Дарил Спітцер

Насправді в 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
Класно! Ви також можете ввести свій власний оператор імпорту після того, як він відкриється в інтерактивному режимі, щоб побачити, звідки походить конкретна вікно.
скорпіодавг

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 на timetime і просто отримую TypeError як для getfile, так і для getourcefile. Особисто у мене встановлено кілька версій python, і мені потрібно знати, НА ЯКУ версію datetimemodule.c вона вказана, тому що зараз я знаю, що вона не вказана на ту, на яку слід вказати, враховуючи версію інтерпретатора, що працює ...
mmitchell

1
@mmitchell: Якщо ви отримуєте TypeError від inspect.getfile (datetime), якщо припустити, що дата насправді є модулем, а не чимось іншим, яким ви призначили те саме ім’я, я впевнений, що це означає, що ви створили спеціальну збірку для статично посилається в дату часу на перекладача, а не робить його завантажуваним модулем. Але можуть бути й інші причини, про які я не думав. Вам потрібно задати нове запитання та дати набагато більше інформації, щоб відтворити це.
abarnert

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

@tristan: Я не впевнений, що я розумію, про що ви запитуєте, але, можливо, це відповість на це: коли __file__працює, inspect.getfileпрацює; немає жодної ситуації, коли здогадка про те, чи використовувати __file__це буде краще, ніж просто використовувати модуль перевірки.
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
Python 3:python -c 'import sys; print("\n".join(sys.path))'
arudzinska

61

Якщо ви використовуєте pip для встановлення своїх модулів, просто pip show $moduleповертається місцезнаходження.


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

це слід позначити як найбільш точну відповідь на поставлене питання.
Рахул Гоял

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

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

Тепер вам потрібно використовувати його таким чином для python3. import importlibпотімimportlib.util.find_spec('fontTools')
Медхат

33

datetime є вбудованим модулем, тому вихідного файлу (Python) немає.

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

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

12

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

та ін


Це дало мені повний шлях до файлу модуля, тоді як інші відповіді дали лише відносні шляхи. Дякую.
Джертер

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

У Windows можна знайти розташування модуля 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
Даріл: Ви заперечували відповідь Джима: "Час дати є одним із модулів пітона, не записаних пітоном".
Меттью Тревор

0

Для тих, хто вважає за краще рішення GUI: якщо ви використовуєте такий gui, як 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 показати 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 здається неактуальним для цього рішення
mousetail

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