У меня есть такая структура файлов:
Folder
Common
foo1.py
TestFolder
foo2.py
Я хочу импортировать в foo2.py
и foo1.py
. Я пытался, но это не работает на Ubuntu:
sys.path.append(os.path.abspath('../../'))
from Common import foo1.py
__init__.py
файл в вашей папке? Вот как Python создает пакеты и позволяет вам импортировать модули из этого пакета. guide.python-distribute.org/creation.htmlОтветы:
Как python находит свои модули
Строго говоря, модуль - это отдельный файл Python, а пакет - это папка, содержащая файлы Python, сопровождаемые (может быть пустым) именем файла
__init__.py
, чтобы сообщить Python, что это пакет для импорта модулей. В обоих случаях модули нуждаются в.py
расширении, но их импорт выполняется без (см. Далее ниже).По умолчанию Python ищет свои модули и пакеты в
$PYTHONPATH
.Чтобы узнать, что входит в $ PYTHONPATH, запустите следующий код в python (3):
Как добавить каталог
Время от времени
Из файла python вы можете время от времени добавлять пути к пути по умолчанию, добавляя следующие строки в раздел head вашего приложения или скрипта python:
Например:
если у меня есть папка:
/home/myname/pythonfiles
и я хочу импортировать файлmodule_1.py
, расположенный в этом каталоге, я добавляю это в раздел head моего кода:И я могу просто импортировать файл
module_1.py
:Когда я создаю пакет и хочу импортировать модуль (и) из пакета, мне нужно создать папку
$PYTHONPATH
, содержащую модули и сопровождаемый (может быть пустым) файлом, который называется__init__.py
Например:
Для того, чтобы импортировать из пакета (папка) называется
my_package
в/home/myname/pythonfiles
, добавьте/home/myname/pythonfiles
путь к вашему$PYTHONPATH
, как и в примере 1, и импортировать модуль с именемmodule_2.py
(в папке пакета) просто с: `Добавление каталогов на
$PYTHONPATH
постоянной основе:Добавьте следующую строку в ваш
~/.profile
файл.Подкаталоги
Изнутри пакета подкаталоги не включаются просто так; вам нужно «связать» каталоги. Чтобы импортировать модуль
module_3.py
, внутри папкиsubfolder
внутри папкиpackagename
:Учитывая тот факт, что все подпапки в пакете содержат собственный
__init__.py
файл.Когда модуль находится в том же каталоге, что и скрипт или приложение
Нет необходимости вставлять путь к модулю, когда он находится в том же каталоге, что и скрипт или приложение, он добавляется автоматически.
Пример:
Если у меня есть папка, содержащая
script.py
иmodule.py
, я могу просто импортировать модуль:источник
printenv PYTHONPATH
ничего?sys.path.append("/path/to/your/package_or_module")
также добавляет путь к значению по умолчанию, и это менее запутанно. По сравнению сsys.path.insert(0,...)
которым имеет0
в качестве первого аргумента.Правильный способ использования относительного импорта:
И вам также нужно
__init__.py
во всех ваших папках.источник
NB: Этот ответ устарел для последней версии Python 3, но здесь для более ранней версии. Для получения дополнительной информации читайте комментарии и https://www.python.org/dev/peps/pep-0420/
По сути, каждая папка с кодом Python, который вы хотите добавить в syspath, нуждается в файле __init__.py. Эти __init__.py файлы могут быть пустыми.
источник
python -c "from pathlib import Path; Path('ns').mkdir(); Path('ns/mod.py').write_text('''print('mod.py')'''); import ns.mod; from shutil import rmtree; rmtree('ns')"
также вот некоторая соответствующая документация, PEP 420, которая описывает добавление семантики пакета пространства имен