У меня есть следующая структура папок.
application/app/folder/file.py
и я хочу импортировать некоторые функции из file.py в другой файл Python, который находится в
application/app2/some_folder/some_file.py
я пробовал
from application.app.folder.file import func_name
и некоторые другие различные попытки, но до сих пор я не смог правильно импортировать. Как я могу это сделать?
Ответы:
По умолчанию вы не можете. При импорте файла Python ищет только текущий каталог, каталог, из которого запускается сценарий точки входа, и
sys.path
который включает в себя местоположения, такие как каталог установки пакета (на самом деле это немного сложнее, чем это, но это покрывает большинство случаев) ,Однако вы можете добавить к пути Python во время выполнения:
источник
sys.path.append('/path/to/application/app/folder')
чище имоsys.path
возвращает alist
, а не adeque
, и было бы глупо конвертировать вlist
adeque
и обратно.Ничего плохого в:
Просто убедитесь, что
folder
также содержит__init__.py
, это позволяет включить его в пакет. Не уверен, почему другие ответы говорят оPYTHONPATH
.источник
PYTHONPATH
необходимо. Скажем, у вас есть две папки на одном уровне:A
иB
.A
имеет__init.py__
. Попробуйте импортировать что-тоB
изнутриA
.init.py
или__init__.py
файл?application
иapp
пакеты уже (то есть у вас уже есть__init__.py
в обоих). В результате добавления__init__.py
также кfolder
,application.app.folder
становится (суб) пакет , из которого можно получить доступ к модулюapplication.app.folder.file
, символ которойfunc_name
могут быть импортированыКогда модули находятся в параллельных местах, как в вопросе:
Это сокращение делает один модуль видимым для другого:
источник
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
cli/foo.py
из командной строкиimport cli.bar
sys.path.append('.')
затем импортируете модуль с помощьюfrom app2.some_folder.some_file import your_function
. Кроме того, у меня работает запускpython3 -m app2.another_folder.another_file
из корневой папки.Первый импорт sys в name-file.py
Второй добавить путь к папке в name-file.py
В-третьих, создайте пустой файл с именем __ init __.py в своем подкаталоге (это говорит Python, что это пакет)
Четвертый импорт модуля внутри папки в name-file.py
источник
sys.path.insert
-команды. Таким образом, ответ оставляет вопрос, работает ли это решение, даже если имя-папка находится в произвольном месте.Я думаю, что специальным способом было бы использовать переменную окружения,
PYTHONPATH
как описано в документации: Python2 , Python3источник
Ответы здесь не ясны, это проверено на Python 3.6
С этой структурой папок:
Где
myfile.py
находится содержание:Оператор импорта в
main.py
:и это напечатает привет .
источник
__init__.py
?__init__.py
не работает для меня. Я использую Py 3.6.5 на Ubuntu 18. Он работает на Pycharm, но не с терминалаВаша проблема в том, что Python ищет этот файл в каталоге Python и не находит его. Вы должны указать, что вы говорите о каталоге, в котором вы находитесь, а не о Python.
Для этого вы измените это:
from application.app.folder.file import func_name
к этому:
Добавляя точку, вы говорите, ищите в этой папке папку приложения, а не ищите в каталоге Python.
источник
Из того, что я знаю, добавление
__init__.py
файла непосредственно в папку функций, которые вы хотите импортировать, сделает эту работу.источник
sys.path.append(tools_dir)
на Windows, и мне не нужно добавлять__init__.py' file in my directory
tools_dir`В Python 3.4 и более поздних версиях вы можете импортировать напрямую из исходного файла (ссылка на документацию) . Это не самое простое решение, но я включаю этот ответ для полноты.
Вот пример. Сначала импортируемый файл с именем
foo.py
:Код, который импортирует файл выше, в значительной степени вдохновлен примером в документации:
Выход:
Обратите внимание, что имя переменной, имя модуля и имя файла не обязательно должны совпадать. Этот код все еще работает:
Выход:
Программный импорт модулей был представлен в Python 3.1 и дает вам больше контроля над тем, как импортируются модули. Обратитесь к документации для получения дополнительной информации.
источник
У меня работал в python3 на linux
источник
sys.path.append("/home/linux/folder/")
- Убедитесь, что не используете ярлык, например"~/folder/"
Попробуйте относительный импорт Python:
Каждая начальная точка - это еще один более высокий уровень в иерархии, начинающийся с текущего каталога.
Проблемы? Если это не работает для вас, то вы, вероятно, получаете немного от относительного импорта многих приобретенных товаров. Прочитайте ответы и комментарии для получения более подробной информации: Как исправить «Попытка относительного импорта в неупакованном виде» даже с __init__.py
Подсказка: есть
__init__.py
на каждом уровне каталогов. Вам может понадобитьсяpython -m application.app2.some_folder.some_file
(не включая .py), который вы запускаете из каталога верхнего уровня или иметь этот каталог верхнего уровня в вашей PYTHONPATH. Уф!источник
Я столкнулся с той же проблемой, особенно при импорте нескольких файлов, именно так мне удалось ее преодолеть.
источник
Рассматривая в
application
качестве корневого каталога для вашего питона проекта, создайте пустой__init__.py
файлapplication
,app
иfolder
папку. Затемsome_file.py
внесите изменения следующим образом, чтобы получить определение func_name:источник
Использование sys.path.append с абсолютным путем не идеально при перемещении приложения в другие среды. Использование относительного пути не всегда работает, потому что текущий рабочий каталог зависит от того, как был вызван скрипт.
Поскольку структура папок приложения фиксирована, мы можем использовать os.path, чтобы получить полный путь к модулю, который мы хотим импортировать. Например, если это структура:
И скажем, вы хотите импортировать модуль "манго". Вы можете сделать следующее в vanilla.py:
Конечно, вам не нужна переменная mango_dir.
Чтобы понять, как это работает, посмотрите на этот пример интерактивного сеанса:
И проверьте документацию os.path .
источник
Это работает для меня на окнах
источник
Я совершенно особенный: я использую Python с Windows!
Я просто дополняю информацию: для Windows и Linux работают как относительные, так и абсолютные пути
sys.path
(мне нужны относительные пути, потому что я использую свои скрипты на нескольких ПК и в разных основных каталогах).И при использовании Windows и то,
\
и другое/
можно использовать как разделитель для имен файлов, и, конечно, вы должны удвоить\
строки Python,некоторые допустимые примеры:
(примечание: я думаю, что
/
это более удобно, чем\
событие, если оно менее «родное» для Windows, поскольку оно совместимо с Linux и проще для записи и копирования в проводник Windows)источник
Если цель загрузки модуля по определенному пути - помочь вам при разработке пользовательского модуля, вы можете создать символическую ссылку в той же папке тестового скрипта, которая указывает на корень пользовательского модуля. Эта ссылка на модуль будет иметь приоритет над любыми другими модулями, установленными с таким же именем, для любого сценария, выполняемого в этой папке.
Я проверил это на Linux, но оно должно работать в любой современной ОС, которая поддерживает символические ссылки.
Одним из преимуществ этого подхода является то, что вы можете указывать на модуль, который находится в вашей собственной рабочей копии локальной ветви SVC, что может значительно упростить время цикла разработки и уменьшить режимы сбоев при управлении различными версиями модуля.
источник
В моем случае у меня был класс для импорта. Мой файл выглядел так:
В мой основной файл я включил код через:
источник
Я сталкивался с одним и тем же вопросом несколько раз, поэтому хотел бы поделиться своим решением.
Версия Python: 3.X
Следующее решение предназначено для тех, кто разрабатывает ваше приложение на Python версии 3.X, поскольку Python 2 не поддерживается с января / 1/2020 .
Структура проекта
В Python 3 вам не нужен
__init__.py
подкаталог вашего проекта из-за неявных пакетов пространства имен . См. Не требуется ли init .py для пакетов в Python 3.3+Постановка задачи
В
file_b.py
, я хотел бы импортировать классA
вfile_a.py
папке а.Решения
# 1 Быстрый, но грязный способ
Без установки пакета, как вы сейчас разрабатываете новый проект
Использование,
try catch
чтобы проверить, если ошибки. Пример кода:# 2 Установите пакет
После того, как вы установили свое приложение (в этом посте руководство по установке не включено)
Вы можете просто
Удачного кодирования!
источник
Я работал над проектом, через
a
который я хотел, чтобы пользователи установилиpip install a
следующий список файлов:setup.py
MANIFEST.in
/ init .py
а / a.py
a / b / init .py
A / B / b.py
Я установил модуль, запустив следующее из каталога с
MANIFEST.in
:Затем из совершенно другого места в моей файловой системе
/moustache/armwrestle
я смог запустить:Что подтвердило, что
a.cats
действительно равнялось 0 иa.b.dogs
действительно равнялось 1, как и предполагалось.источник
Вместо того, чтобы просто делать
import ...
, сделайте это:from <MySubFolder> import <MyFile>
MyFile находится внутри MySubFolder.
источник
Вы можете обновить оболочку Python, нажав клавишу f5 или перейти к Run-> Run Module. Таким образом, вам не нужно менять каталог, чтобы что-то прочитать из файла. Python автоматически изменит каталог. Но если вы хотите работать с разными файлами из разных каталогов в оболочке Python, то вы можете изменить каталог в sys, как ранее говорил Кэмерон .
источник
Поэтому я просто щелкнул правой кнопкой мыши на своей IDE и добавил новую,
folder
и мне стало интересно, почему я не смог импортировать ее. Позже я понял, что должен щелкнуть правой кнопкой мыши и создать пакет Python, а не классическую папку файловой системы. Или метод посмертного добавления__init__.py
(который заставляет python рассматривать папку файловой системы как пакет), как упоминалось в других ответах. Добавление этого ответа на случай, если кто-то пойдет по этому пути.источник
Вы можете использовать importlib для импорта модулей, в которые вы хотите импортировать модуль из папки, используя следующую строку:
В этом примере есть main.py, который представляет собой приведенный выше код, затем папку с именем Scripts, и затем вы можете вызывать все, что вам нужно, из этой папки, изменив
scriptName
переменную. Затем вы можете использоватьscript
ссылку на этот модуль. например, если у меня есть функция, вызываемаяHello()
в модуле Snake, вы можете запустить эту функцию следующим образом:Я проверил это в Python 3.6
источник
У меня были эти проблемы несколько раз. Я зашел на эту же страницу много. В моей последней проблеме мне пришлось запускать
server
из фиксированного каталога, но при отладке я хотел запускать из разных подкаталогов.сделал НЕ работать для меня , потому что в разных модулях я должен был прочитать другое * .csv файлы , которые были все в том же каталоге.
В конце концов, то, что сработало для меня, было не питонным, я думаю, но:
Я использовал в
if __main__
верхней части модуля, который я хотел отладить , который запускается не по обычному пути.Так:
источник