Я разрабатываю / тестирую пакет в моем локальном каталоге. Я хочу импортировать его в интерпретатор (v2.5), но sys.path не включает текущий каталог. Прямо сейчас набираю sys.path.insert(0,'.')
. Есть ли способ лучше?
Также,
from . import mypackage
не работает с этой ошибкой:
ValueError: Attempted relative import in non-package
Ответы:
Вы можете использовать относительный импорт только из модуля, который, в свою очередь, был импортирован как часть пакета - ваш скрипт или интерактивный интерпретатор не использовались, поэтому, конечно
from . import
(что означает «импорт из того же пакета, из которого я был импортирован») не не работает.import mypackage
будет хорошо , как только вы убедитесь , родительский каталогmypackage
находится вsys.path
(как вам удалось получить текущий каталог прочь отsys.path
я не знаю - есть ли у вас что - то странное в site.py, или ...)На
sys.path
самом деле нет лучшего способа вернуть ваш текущий каталог, чем поместить его туда.источник
См. Документацию для sys.path:
http://docs.python.org/library/sys.html#sys.path
Цитировать:
Таким образом, нет необходимости использовать sys.path, если вы запускаете интерпретатор python из каталога, содержащего ваш модуль.
Кроме того, чтобы импортировать ваш пакет, просто выполните:
import mypackage
Поскольку каталог, содержащий пакет, уже находится в sys.path, он должен работать нормально.
источник
sys.path
поэтому файлы в нем должны быть найдены раньше файлов где-либо еще в рабочей среде.sys.path.insert(0, new_path)
а неsys.path.append(new_path)
.Если вы хотите запустить немодифицированный скрипт python, чтобы он импортировал библиотеки из определенного локального каталога, вы можете установить
PYTHONPATH
переменную среды, например, в bash:Если вы просто хотите импортировать его из текущего рабочего каталога, используйте
.
обозначение:источник
Будь проще:
try: from . import mymodule # "myapp" case except: import mymodule # "__main__" case
источник
Простой способ заставить его работать - запустить ваш скрипт из родительского каталога с помощью
-m
флага python , напримерpython -m packagename.scriptname
. Очевидно, что в этой ситуации вам понадобится__init__.py
файл, чтобы превратить ваш каталог в пакет.источник
Внутри пакета если есть setup.py , то лучше его установить
источник
Использование
sys.path
должно уже включать текущий каталог.Пытаться:
import .
или:
from . import sth
однако это может быть не очень хорошей практикой, так почему бы просто не использовать:
import mypackage
источник
Немного поздно на вечеринку, но вот что сработало для меня:
>>> import sys >>> sys.path.insert(0, '')
По-видимому, если есть пустая строка, Python знает, что он должен искать в текущем каталоге. У меня не было пустой строки
sys.path
, что вызвало эту ошибку.источник
Раньше я
pathlib
добавлял свой каталог модуля в свой системный путь, так как хотел избежать установки модуля как пакета, и ответ @maninthecomputer у меня не работалimport sys from pathlib import Path cwd = str(Path(__file__).parent) sys.path.insert(0, cwd) from my_module import my_function
источник