Какова степень оператора импорта в Python

Я получаю разные ответы на объем операций импорта в Python. Я провел некоторое исследование Stackoverflow, чтобы узнать, что было сказано по этой теме. Поэтому, если кто-то хочет импортировать модуль python из текущего рабочего каталога, файл с расширением .py, тогда проблем не должно быть. Однако, если кто-то хочет импортировать файл .py из другого каталога, тогда есть два ответа, которые противоречат моему мнению (возможно, потому, что у меня нет полного понимания, но я пытаюсь это понять):

Во-первых, этот ответ « Импорт файлов из другой папки в Python », который говорит, что мы не можем импортировать файлы из разных папок или каталогов в python.

Во-вторых, этот ответ « Как импортировать модуль с полным путем? «который говорит, что мы можем.

Может кто-нибудь объяснить мне, в чем разница?

4 Solutions collect form web for “Какова степень оператора импорта в Python”

Импорт в Python очень прост:

  1. Импорт может выполняться только посредством ссылок на модули (а не на пути)
  2. Python ищет вещи, которые он может импортировать в следующем порядке:
    1. Из каталога, в котором был выполнен сценарий.
    2. Из каталогов в переменной среды PYTHONPATH (если ее набор).
    3. Из общесистемного каталога модулей установки Python.

Он берет эти три вещи и строит список sys.path и ищет его в указанном порядке. У этого есть некоторые основные проблемы. Например, если у вас есть каталог со следующими файлами:

 foo.py math.py 

В foo.py если вы скажете import math он будет импортировать вещи из math.py а не из глобальной math библиотеки, которая поставляется с Python. Это связано с тем, что текущий каталог сначала выполняется для модулей.

Чтобы импортировать и использовать модули из пути файловой системы, который не находится в трех местах, которые ищет Python, вам нужно добавить его в переменную sys.path , прежде чем делать какие-либо импорт:

 import sys sys.path.insert(0, '/some/directory/') from somemodule import something 

Грубо говоря, в первом примере говорится, что вы не можете использовать оператор импорта для импорта из указанного места на диске. Во втором примере говорится, что вы можете добиться аналогичного эффекта, используя модуль imp (который обеспечивает доступ к внутренним компонентам системы импорта). Таким образом, вы не можете «действительно» импортировать такой модуль (в том смысле, что вы не можете использовать import для этого), но вы можете использовать модуль imp чтобы «заставить его работать».

Так что если ваш вопрос о заявлении на import , то нет, вы не можете (без взлома, см. Ниже); если ваш вопрос о простом «загрузке модуля» (не обязательно используя статус import ), то да, вы можете. Это вроде как сказать: «Можете ли вы открыть эту дверь? Нет, потому что у вас нет ключа. Вы можете открыть эту дверь? Да, разбив ее кувалдой».

Кроме того, обратите внимание, что даже первый пример предоставляет способ сделать это, это всего лишь немного уродливый взлом.

На практике реальный вопрос заключается в том, почему вы чувствуете, что вам нужно это делать. Это редко необходимо и обычно означает, что вы создаете ненужную сложную библиотечную структуру.

Оба ответа верны. Первый использует прямой оператор import , и, действительно, вы не можете импортировать из другой папки таким образом.

Первый добавляет путь к sys.path , который представляет собой список каталогов, которые python будет искать при импорте модуля. Второй не использует оператор import , но использует imp.load_source который работает по-разному.

Обычно вам нужно либо поместить все это в один файл, либо сделать скрипт в иерархии более высоких папок, которые импортируют все необходимые файлы.

Понимаю это:

При импорте файла Python ищет только текущий каталог, каталог, из которого выполняется сценарий начальной точки, и sys.path, который включает такие места, как каталог установки пакета

: Цитата из Импорт файлов из другой папки в Python
Теперь давайте скажем, что у вас есть файлы:

 I) application/app/folder/file.py II) application/app2/some_folder/some_file.py 

Вы хотите импортировать функции из файла some_file.py в файл file.py. Когда вы делаете from application.app.folder.file import func_name , python пытается разрешить путь application.app.folder.file . Он ищет, если в текущем каталоге есть пакет / модуль с именем application которое представляет собой application/app/folder/ для file.py и пути каталога в sys.path ; и python не находит application в любом из стандартных путей поиска. Поэтому по умолчанию вы не можете импортировать пути из какой-либо другой папки, которая не находится в пути python, но вы можете указать python о ваших пользовательских маршрутах поиска. Вы делаете это, добавляя свои пути к пути python ( sys.path )

 import sys sys.path.insert(0, 'application/app2/some_folder') import some_file 

Если вы хотите импортировать файл, для которого вы знаете абсолютный / полный путь (как в разделе «Как импортировать модуль с полным путем?» ), Вы делаете это как

 import imp foo = imp.load_source('module.name', '/path/to/file.py') foo.MyClass() 
  • неверные ответы для квадратичных уравнений
  • Преобразование строки в целое с помощью map ()
  • Как сравнить каждый элемент в списке с остальным, только один раз?
  • Невозможно развернуть мое приложение в Google App Engine
  • В Python, зачем нам нужны readlines (), когда мы можем перебирать сам дескриптор файла?
  • Подход к анализу файла и создание динамической структуры данных для использования другой программой
  • Проверка ввода - это число в python
  • Автоматическое преобразование вкладок pycharm в пространство
  •  
    Interesting Posts for Van-Lav

    Django: кеш сеанса не обновляется при использовании хранилища сеансов на основе файлов cookie

    Плохая автоматическая триангуляция с Mayavi для окраски поверхности, известной только ее углом

    Тайм-аут рабочих Gunicorn независимо от того, что

    игнорировать некоторые меркуриальные команды в меркуриальном крюке

    Почему «если нет (a и b)« быстрее, чем «если нет или нет b»?

    попытка импортировать модуль: undefined symbol: PyUnicodeUCS4_DecodeUTF8

    конвертировать список строк, которые я хотел бы преобразовать в список кортежей

    Java: эквивалент диапазона Python (int, int)?

    abs () vs fabs () разность скоростей и преимущество fabs ()

    Как сделать мою реализацию жадного набора обложки быстрее?

    драйвер selenium не может загружать НЕКОТОРЫЕ страницы

    Создание пользовательского слоя Caffe в python

    Хранить и перезагружать объект matplotlib.pyplot

    Цвет фона для Tk в Python

    Эффективное вычисление евклидовой матрицы расстояний с использованием Numpy

    Python - лучший язык программирования в мире.