2013-05-29 4 views
3

Я строю библиотеку, которая будет включена в другие проекты через pip.Невозможно импортировать модуль из каталога bin из того же проекта

У меня есть следующие директории ('venv' является virtualenv):

project 
    \- bin 
    \- run.py 
    \- myproj 
    \- __init__.py 
    \- logger.py 
    \- venv 

Активирую virtualenv.

В бен/run.py у меня есть:

from myproj.logger import LOG 

, но я всегда получаю

ImportError: No module named myproj.logger 

следующие работы от 'проекта' реж:

python -c "from myproj.logger import LOG" 

Это не правильное добавление каталога «project» в pythonpath при вызове из каталога «bin». Как импортировать модули из «myproj» из сценариев в моем каталоге bin?

ответ

5

Простейшим решением является добавление родительской папки в качестве пути к поиску, над импортом.

import sys,os 
sys.path.append(os.path.abspath('..')) 
from myproj.logger import LOG 
+0

OK спасибо. Я этого раньше не видел. – user1491250

+2

Учитывая, что OP использует virtualenv; манипуляции 'sys.path' [не нужны] (http://stackoverflow.com/a/16816683/4279) или даже [вредные] (http://stackoverflow.com/a/14186074/4279). – jfs

+1

Я предпочитаю использовать абсолютный путь из сценария, чтобы сценарий можно было запускать из любого места. 'sys.path.append (os.path.join (os.path.dirname (sys.argv [0]), '..'))' –

0

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

6

myprojectvenv virtualenv; то вы сможете импортировать myproject из любого скрипта (включая bin/run.py), в то время как среда активируется без sys.path хаков.

Чтобы установить, создать project/setup.py для myproject пакета и запустить из каталога project в то время как virtualenv активен:

$ pip install -e . 

Это установит myproject InPlace (изменения в myproject модулей видны сразу без переустановки myproject) ,

+1

Учитывая, что OP использует virtualenv, это должен быть принятый ответ , – kkurian

0

добавить путь проекта в PYTHONPATH

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