Импортировать пакет Python из локального каталога в интерпретатор - PullRequest
73 голосов
/ 11 июля 2009

Я разрабатываю / тестирую пакет в моем локальном каталоге. Я хочу импортировать его в интерпретатор (v2.5), но sys.path не включает текущий каталог. Прямо сейчас я набираю sys.path.insert(0,'.'). Есть ли способ лучше?

Также

from . import mypackage

терпит неудачу с этой ошибкой:

ValueError: Attempted relative import in non-package

Ответы [ 9 ]

37 голосов
/ 11 июля 2009

Вы можете использовать относительный импорт только из модуля, который, в свою очередь, был импортирован как часть пакета - ваш скрипт или интерактивный интерпретатор не были, поэтому, конечно, from . import (что означает «импорт из того же пакета, который импортирован из ") не работает. import mypackage будет в порядке, если вы убедитесь, что родительский каталог mypackage находится в sys.path (как вам удалось получить текущий каталог вдали от sys.path Я не знаю - вы есть что-то странное в site.py или ...?)

Чтобы вернуть ваш текущий каталог в sys.path, на самом деле нет лучшего способа, чем поместить его туда; -).

13 голосов
/ 11 июля 2009

См. Документацию по sys.path:

http://docs.python.org/library/sys.html#sys.path

Цитировать:

Если каталог скриптов недоступен (например, если интерпретатор вызывается в интерактивном режиме или если скрипт читается из стандартного ввода), path [0] является пустой строкой, которая направляет Python для поиска модулей в текущем каталоге.

Итак, вам не нужно использовать sys.path, если вы запускаете интерпретатор python из каталога, в котором находится ваш модуль.

Кроме того, чтобы импортировать вашу посылку, просто выполните:

import mypackage

Поскольку каталог, содержащий пакет, уже находится в sys.path, он должен работать нормально.

10 голосов
/ 16 февраля 2017

Если вы хотите запустить немодифицированный скрипт Python, чтобы он импортировал библиотеки из определенного локального каталога, вы можете установить переменную среды PYTHONPATH - например в баш:

export PYTHONPATH=/home/user/my_libs
python myscript.py

Если вы просто хотите импортировать его из текущего рабочего каталога, используйте обозначение .:

export PYTHONPATH=.
python myscript.py
7 голосов
/ 28 февраля 2014

Не усложняйте:

 try:
     from . import mymodule     # "myapp" case
 except:
     import mymodule            # "__main__" case
5 голосов
/ 05 февраля 2010

Простой способ заставить его работать - запустить скрипт из родительского каталога, используя флаг -m python, например python -m packagename.scriptname. Очевидно, что в этой ситуации вам нужен файл __init__.py, чтобы превратить ваш каталог в пакет.

2 голосов
/ 11 июля 2009

Использование sys.path должно включать текущую директорию.

Попробуйте:

import .

или

from . import sth

однако это может быть не очень хорошая практика, так почему бы просто не использовать:

import mypackage
0 голосов
/ 25 июня 2019

Немного опоздал на вечеринку, но вот что у меня сработало:

>>> import sys
>>> sys.path.insert(0, '')

Очевидно, что если есть пустая строка, Python знает, что она должна выглядеть в текущем каталоге. У меня не было пустой строки в sys.path, что вызвало эту ошибку.

0 голосов
/ 15 марта 2019

Внутри пакета, если есть setup.py , тогда лучше установить его

pip install -e .
0 голосов
/ 25 сентября 2018

Если вы хотите импортировать все методы из определенного пакета / файла в одном и том же каталоге, правильный способ импортирования - это from mypackage import *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...