2015-07-16 3 views
0

У меня есть несколько скриптов, которые использовали общий код в другом каталоге (который является подкаталогом).В Python 3 можно ли импортировать файл из подкаталога?

По различным причинам я не хочу упаковать общий код в пакет Python и не хочу, чтобы все файлы были удалены в один каталог, и я не хочу добавить подкаталог в путь.

Есть ли способ сделать относительный импорт & вытащить файлы в подкаталоге в Python 3?

В IPython3

import subdir.my_shared_library 

работает отлично.

Однако это не удается в Python3, а также каждая попытка, которую я сделал, добавить файлы __init__.py и сделать относительный импорт явно как import .subdir.my_shared_library.

Есть ли способ обойти это?

+0

Если подкаталог содержит '__init__.py', даже если этот файл пуст, python рассмотрит каталог как пакет. Если этот каталог является подкаталогом рабочего каталога для скрипта, тогда 'import subdirpackage.modulename' должен работать нормально, где modulename - это имя одного из файлов, которые вы хотите импортировать. Если вы используете сценарии с другим рабочим каталогом, вам нужно будет добавить подкаталог в путь python. – zstewart

ответ

2

Нужно добавить только __init__.py в \subdir, а затем импортировать через from subdir import my_shared_library. Если вы не хотите компилировать его в пакет с остальной частью своего кода, вы также можете добавить его к PATH с использованием sys.path.append('subdir') или типичного экспорта в PYTHONPATH. Если вы не хотите касаться путей, вы можете просто удалить его в глобальном site-packages или, альтернативно, создать виртуальную среду через что-то вроде pyvenv и поместить свою библиотеку в папку пакета там.

+0

@ Бен Хэмнер упомянул в вопросе, что он не хочет упаковывать общий код в подкаталог. – rohithvsm

+0

О, верно, он также упомянул, что не добавлял его в «PATH». Я предполагаю, что если это действительно общая библиотека, она может просто перейти в 'site-packages', будь то папка пакета в локальной установке Python или одна в« venv ». – henrymei

+0

Может быть, он не хочет добавлять в sys.path код. Хотя добавление добавления к PYTHONPATH имеет такой же эффект. – rohithvsm

0

Да. Используйте абсолютный импорт:

import subdir.my_shared_library 

Он предполагает, что родителя из subdir в sys.path, как это тот случай, когда вы запускаете скрипт Python из той же директории (родителя).

Он работал бы, даже если в каталоге не было __init__.py. В этом случае subdir будет рассматриваться как implicit namespace package. Хотя вы не должны злоупотреблять этой функцией.

Если вы не хотите subdir быть пакет Python то есть, если вы хотите, чтобы рассмотреть my_shared_library как модуль верхнего уровня затем добавить subdir сам на путь питона (предполагая, что синтаксис Баша для команды и пустого оригинала PYTHONPATH envvar):

$ PYTHONPATH=subdir python -m your_module 

где your_module.py использует import my_shared_library. Или (хуже) добавьте sys.path.insert(1, 'subdir') в свой модуль напрямую.

Смежные вопросы