Импортировать пакет python из локального каталога в интерпретатор
Я разрабатываю/тестирую пакет в своем локальном каталоге. Я хочу импортировать его в интерпретаторе (v2.5), но sys.path не включает текущий каталог. Сейчас я печатаю sys.path.insert(0,'.')
. Есть ли способ лучше?
Кроме того,
from . import mypackage
не удается выполнить эту ошибку:
ValueError: Attempted relative import in non-package
Ответы
Ответ 1
Вы можете использовать относительный импорт только в модуле, который в свою очередь был импортирован как часть пакета - ваш script или интерактивный интерпретатор не был, поэтому, конечно, from . import
(что означает "импорт из того же пакет, который я импортировал из" ) не работает. import mypackage
будет прекрасным после того, как вы обеспечите, чтобы родительский каталог mypackage
находился в sys.path
(как вам удалось удалить текущую директорию из sys.path
, я не знаю - у вас что-то странное на сайте. py, или...?)
Чтобы вернуть ваш текущий каталог в sys.path
, на самом деле нет лучшего способа, чем положить его туда; -).
Ответ 2
Смотрите документацию для sys.path:
http://docs.python.org/library/sys.html#sys.path
Цитата:
Если каталог script недоступен (например, если интерпретатор вызывается в интерактивном режиме или если script считывается со стандартного ввода), путь [0] - это пустая строка, которая направляет Python на поиск модулей в текущий каталог.
Итак, нет необходимости обезьяны с sys.path, если вы начинаете интерпретатор python из каталога, содержащего ваш модуль.
Кроме того, чтобы импортировать ваш пакет, просто выполните:
import mypackage
Поскольку каталог, содержащий пакет, уже находится в sys.path, он должен работать нормально.
Ответ 3
Если вы хотите запустить немодифицированный python script, чтобы он импортировал библиотеки из определенного локального каталога, вы можете установить переменную среды PYTHONPATH
- например, в bash:
export PYTHONPATH=/home/user/my_libs
python myscript.py
Если вы хотите, чтобы он импортировался из текущего рабочего каталога, используйте обозначение .
:
export PYTHONPATH=.
python myscript.py
Ответ 4
Держите его простым:
try:
from . import mymodule # "myapp" case
except:
import mymodule # "__main__" case
Ответ 5
Простым способом заставить его работать - запустить script из родительского каталога, используя флаг python -m
, например. python -m packagename.scriptname
. Очевидно, что в этой ситуации вам нужен файл __init__.py
, чтобы превратить ваш каталог в пакет.
Ответ 6
Использование sys.path
должно включать текущий каталог уже.
Try:
import .
или
from . import sth
однако это может быть не очень хорошая практика, поэтому почему бы просто не использовать:
import mypackage
Ответ 7
Внутри пакета, если есть setup.py, то лучше его установить
pip install -e .
Ответ 8
Немного опоздал на вечеринку, но вот что сработало для меня:
>>> import sys
>>> sys.path.insert(0, '')
Видимо, если есть пустая строка, Python знает, что она должна смотреть в текущем каталоге. У меня не было пустой строки в sys.path
, которая вызвала эту ошибку.
Ответ 9
Если вы хотите импортировать все методы из определенного пакета/файла в одном и том же каталоге, правильный способ импорта - это from mypackage import *