Что ищет Python, когда пытается «импортировать»? - PullRequest
0 голосов
/ 29 октября 2018

Представьте себе некоторый гипотетический код Python:

from turboencabulator import panametricfan

Если я попытаюсь запустить это на моем компьютере (Windows, 64-битная, Windows 10), он не может найти turboencabulator модуль:

enter image description here

Что он ищет?

Когда Python пытается загрузить модуль, что он ищетза?Это .py файл?Это .dll (так как это Windows).Это папка?

Windows имеет модули;они называются сборками

В Windows существует понятие сборок .Если вы объявите, что хотите использовать сборку с именем turboencabulator, он будет искать манифест сборки :

  • turboencabulator.manifest

Youтакже можно создать папку с именем turboencabulator, где он будет искать сборочный манифест:

turboencabulator
|--- turboencabulator.manifest 

Этот манифест в свою очередь объявляет все файлы, составляющие эту сборку,

Например, если мне нужно использовать Microsoft Visual C Runtime 8.0 , я бы объявил зависимость от модуля

Microsoft.VC80.CRT

Тогда Windows отправится на поиски:

  1. Microsoft.VC80.CRT.manifest файла в папке
  2. Microsoft.VC80.CRT папка
    • , которая затем должна содержать Microsoft.VC80.CRT.manifest
  3. Некоторые другие места (например, WinSxS, может быть, путь, который знает)

И тогда манифест представляет собой просто текстовый файл, который позволяет узнать, что msvcrt состоит из 3 dll:

  • <file name="msvcr80.dll" />
  • <file name="msvcp80.dll" />
  • <file name="msvcm80.dll" />

Что ищет Python?

Когда я указываю, я хочу импортировать модуль:

from RetroEncabulator import GirdleSpring

что ищет python?

  • двоичный файл?
  • почтовый индекс?
  • это именованный элемент, который был зарегистрирован вRegistry?
  • имя файла манифеста модуля, который объявляет все файлыпри составлении модуля?

Что именно , собственно, ищет python?

Бонусные вопросы

  • где этоlook
  • можно ли его настроить на поиск мест
  • могут ли модули быть зарегистрированными где-нибудь, чтобы у не было для охоты?(как правильно написано для Windows-приложений)

Bonus Chatter

  • на самом деле я from numpy
  • на самом деле яfrom cntk

И ни одна из этих "вещей" "не найдена" .

Bonus Reading

Дополнительное расследование

Чтобы доказать это, я решил на самом деле шпионить за Python, чтобы посмотреть, как он выглядит и выглядитдля:

  • HKEY_CURRENT_USER / Программное обеспечение / Python / PythonCore / 2.7 / Модули / турбоэнкабулатор
  • HKEY_LOCAL_MACHINE / Программное обеспечение / Python / PythonCore / 2.7 / Модули / турбокабулятор
  • D: \ DevelopPy \ Bunny \ turboencabulator.pyd
  • D: \ DevelopPy \ Bunny \ turboencabulator.py
  • D: \ DevelopPy \Bunny \ turboencabulator.pyw
  • D: \ DevelopPy \ Bunny \ turboencabulator.pyc
  • D: \ Programs \ Python27 \ DLLs \ turboencabulator
  • D: \ Programs \ Python27 \ Lib \ turboencabulator
  • D: \ Programs \ Python27 \ Lib \ site-packages \ turboencabulator

Я вижу это, просматривая реестр.Означает ли это, что он может быть зарегистрирован?
Я вижу, что ищет файлы, кроме py (pyc, pyw, pyd).Они скомпилированы?
Я вижу это, глядя в папку Python\DLLs.Означает ли это, что могут быть DLL?
Я вижу это в Lib?Это для бинарных файлов промежуточных объектов?

1 Ответ

0 голосов
/ 29 октября 2018

Когда вы включаете оператор import в ваш код, python пытается найти файл python *1003* или каталог пакета с файлом __init__.py в следующем порядке

  1. текущий рабочий каталог
  2. пакеты локальных пользовательских сайтов
  3. общие пакеты сайта

Путь можно увидеть по следующему коду

import sys
print(sys.path)

Вы также можете добавить свой собственный путь.

Примечание: Вы должны добавить эту строку перед импортом других модулей

import sys
sys.path.append("your/complete/path/to/directory")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...