Как импортировать файл .py из другого каталога? [Дубликат]

18

У меня есть эта структура файлов (каталог и файлы со стрелками):

model -> py_file.py 
report -> other_py_file.py

main __init__.py :

import model
import report

каталог модели:

import py_file

каталог отчетов:

import other_py_file

теперь в other_py_file Я хочу импортировать py_file , но что бы я ни старался, я даю ошибку, что такого модуля нет.

Я пробовал это: % Co_de%

Тогда: % Co_de%

Похоже, эти две папки не видят друг друга. Как импортировать файл из другого каталога? Нужно ли указывать дополнительные импортные файлы в файлах init .py?

    
задан Andrius 09.04.2014 в 09:29
источник
  • Вы не можете импортировать назад в структуру папок, ваша структура предназначена для использования из корневого каталога и для импорта отчета, который будет импортировать файл other_py_file. Выполнение импорта ../model не будет работать. –  Torxed 09.04.2014 в 09:31
  • @Torxed Найден способ использования ссылки, предоставленной вами. Для чего мне нужно было использовать импорт из имени папки приложения, например: from my_app.model import py_file. Я попробовал нечто подобное, например, от addons.my_app.model import py_file. Когда это не сработало, я подумал, что мне нужно сделать что-то еще и пропустить часть импорта только из каталога приложений. –  Andrius 09.04.2014 в 09:36
  • Проверьте мое решение ниже. Это лучше подходит для вашей модели программирования. –  Torxed 09.04.2014 в 09:38
  • @Torxed Я считаю, что лучшее решение - просто использовать определенный путь, как в одном из ответов, приведенных в вашей ссылке, потому что в основном мне не нужно импортировать много файлов так, как мне нужно сейчас. –  Andrius 09.04.2014 в 09:52
  • Мой ответ использует конкретные (абсолютные) пути и может быть объединен с os.walk (), например, если вы хотите динамически импортировать материал или просто создать defimimport (имя, путь): и вызвать это для каждого модуля вы хотите импортировать. Просто мысль. –  Torxed 09.04.2014 в 09:54

2 ответа

30

Вы можете добавить к системному пути во время выполнения:

import sys
sys.path.insert(0, 'path/to/your/py_file')

import py_file

Это самый простой способ сделать это.

    
ответ дан Alex Thornton 09.04.2014 в 09:47
источник
  • Да, это простой способ, который может вызвать проблемы при импорте из папки, где у вас есть то же имя файла, что и другая библиотека. Altho, что было бы в случае с OP в любом случае, поэтому я думаю, это не вредит ... –  Torxed 09.04.2014 в 09:52
  • @Torxed Я вставил путь в начале преднамеренно, чтобы пользовательский путь искался первым, чтобы обрабатывать конфликты имен, поэтому это не будет проблемой. –  Alex Thornton 09.04.2014 в 10:00
13

Python3:

import importlib.machinery

loader = importlib.machinery.SourceFileLoader('report', '/full/path/report/other_py_file.py')
handle = loader.load_module('report')

handle.mainFunction(parameter)

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

Претензии к Себастьяну для создания аналогичного ответ для Python2:

import imp

foo = imp.load_source('module.name', '/path/to/file.py')
foo.MyClass()
    
ответ дан Torxed 09.04.2014 в 09:33
источник
  • Разве это не слишком сложно? –  Alex Thornton 09.04.2014 в 09:52
  • @AlexThornton На самом деле, поскольку пользователь не хочет импортировать файлы python из объема проекта, я лично считаю, что лучше использовать абсолютные пути для импорта вещей, а не для добавления в глобальную область импорта. Моя тоже более терпимая к ошибкам, которую я проповедую - это хорошо :) –  Torxed 09.04.2014 в 09:55
  • @AlexThornton Ну, очевидно, это не совсем идиотский доказательство, но теоретически можно импортировать /home/time.py, не заменяя библиотеку времени в комплекте. Предполагая, что OP не добавляет sys.path, это обеспечит вам импорт правильной библиотеки независимо от того, что не имеет значения, как вы это делаете, путь, который вы поставляете, будет эффективно импортироваться модулем. Вы также можете настроить пространства имен, которые вы не можете сделать, если будете делать традиционный импорт ... Более того, это превратится в пламенную войну, над которой лучшее решение, что я не собираюсь продвигать, это вопрос вкуса , это оно :) –  Torxed 09.04.2014 в 10:05
  • @AlexThornton Чтобы уточнить, ваше решение неплохое, и оно действительно работает. Так что опять-таки, это стиль вкуса, который вы предпочитаете по сравнению с другим, потому что чистый результат будет таким же. –  Torxed 09.04.2014 в 10:07
  • Мне нужно импортировать каждый файл отдельно? как я могу импортировать несколько файлов из одного каталога? –  olexandr 08.05.2018 в 13:17