2009-07-11 2 views
57

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

Кроме того,

from . import mypackage 

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

ValueError: Attempted relative import in non-package 
+0

Где вы читали, что «» был модулем Python? –

+9

@ Lott: Это относительный путь импорта, описанный здесь: http://docs.python.org/reference/simple_stmts.html#the-import-statement – projectshave

ответ

28

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

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

+0

Python 2.5 для Ubuntu 8.10 не имеет текущего каталога (пустая строка) в sys.path для интерпретатора. Я ничего не изменил, так что это почему-то было отправлено таким образом. Я только что установил 3.0 и sys.path. У них есть '' в sys.path. – projectshave

+0

@projectshave, хорошо, Ubuntu, без сомнения, получил свои причины! Я не заметил этого в 8.04 (что мы сейчас используем на работе), но, возможно, я просто не уделял достаточного внимания. –

+1

Я частично ошибаюсь. Python, вызванный из оболочки, имеет текущий каталог в sys.path. Python, вызванный из Emacs, не имеет текущего каталога. Странный. – projectshave

2

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

Try:

import . 

или:

from . import sth 

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

import mypackage 
+1

Проблема с заключается в том, что он будет загружать пакет из глобального python env, он может загружать пакет/файл из локальной папки, но он может так же загружать другой случайный mypackge, который находится в рабочем env. –

12

Смотрите документацию для SYS. путь:

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

процитировать:

If the script directory is not available (e.g. if the interpreter is invoked interactively or if the script is read from standard input), path[0] is the empty string, which directs Python to search modules in the current directory first.

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

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

import mypackage 

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

+0

Это не удастся, если подобное имя файла существует где-то еще в рабочей среде. –

+0

@ JAR.JAR.beans, текущий рабочий каталог должен быть первым в 'sys.path', поэтому файлы должны быть найдены перед файлами в другом месте в рабочей среде. – SpoonMeiser

+0

Хорошая точка. То есть, если мы запустим файл из локального каталога. В случае, если это некоторая другая папка, и в случае необходимости изменения sys.path - это означает 'sys.path.insert (0, new_path)', а не 'sys.path.append (new_path)'. –

4

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

4

Держите это просто:

try: 
    from . import mymodule  # "myapp" case 
except: 
    import mymodule   # "__main__" case 
+3

Мне нравится это решение, оно самое простое. Единственный оставшийся вопрос заключается в том, почему правило «только один способ сделать это» считается необязательным при импорте импорта ... Серьезно существует около 15 способов объявления и организации пакетов, все из которых имеют недостатки –

5

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

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

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

export PYTHONPATH=. 
python myscript.py 
Смежные вопросы