2009-06-16 3 views
10

Для моего приложения Python, у меня есть следующие каталоги структура:Как импортировать модуль из каталога на уровень выше текущего сценария

\myapp 
\myapp\utils\ 
\myapp\utils\GChartWrapper\ 
\myapp\model\ 
\myapp\view\ 
\myapp\controller\ 

Один из моего класса в \ MyApp \ вид \ должен импортировать класс GChartWrapper. Тем не менее, я получаю сообщение об ошибке импорта ...

myview.py 
from myapp.utils.GChartWrapper import * 

Здесь ошибка:

<type 'exceptions.ImportError'>: No module named GChartWrapper.GChart 
     args = ('No module named GChartWrapper.GChart',) 
     message = 'No module named GChartWrapper.GChart' 

Что я делаю неправильно? Мне действительно тяжело импортировать модули/классы в Python ...

ответ

7

__init__.py file пакета GChartWrapper ожидает пакет GChartWrapper на PYTHONPATH. Вы можете сказать по первой строке:

from GChartWrapper.GChart import * 

Нужно иметь GChartWrapper включенный пакет в вашей структуре каталога пакета? Если это так, то одна вещь, которую вы можете сделать, это добавить путь, по которому пакет находится в sys.path во время выполнения. Я принимаю его myview.py находится в каталоге myapp\view? Тогда вы могли бы сделать это, прежде чем импортировать GChartWrapper:

import sys 
import os 
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'utils'))) 

Если нет необходимости иметь его в своей структуре каталогов, это может быть проще, чтобы установить его на обычном месте. Это можно сделать, запустив скрипт setup.py, который включен в дистрибутив источника GChartWrapper.

+0

Я пытаюсь использовать GChartWrapper в App Engine, поэтому я не могу запустить настройку. Благодаря! :) – Martin

2

Вы можете изменить путь, в котором python ищет файлы.

В верхней части исходного файла добавьте:

import sys 
sys.path.append("..") 

Или же изменить переменную окружения:

export PYTHONPATH=.. 
5

Вы не импортировать модули и пакеты из arbritary путей Вместо этого питона вы использовать пакеты и абсолютный импорт, что позволит избежать всех будущих проблем.

Пример:

создать следующие файлы:

MyApp\myapp\__init__.py 
MyApp\myapp\utils\__init__.py 
MyApp\myapp\utils\charts.py 
MyApp\myapp\model\__init__.py 
MyApp\myapp\view\__init__.py 
MyApp\myapp\controller\__init__.py 
MyApp\run.py 
MyApp\setup.py 
MyApp\README 

Файлы должны быть пустыми за исключением тех:

MyApp\myapp\utils\charts.py:

class GChartWrapper(object): 
    def __init__(self): 
     print "DEBUG: An instance of GChartWrapper is being created!" 

MyApp\myapp\view\__init__.py:

from myapp.utils.charts import GChartWrapper 

def start(): 
    c = GChartWrapper() # creating instance of the class 

MyApp\run.py:

from myapp.view import start 
start() 

Это все! Когда вы запустите свою точку входа (run.py), она вызывает функцию в представлении и создает экземпляр класса GChartWrapper. Используя эту структуру, вы можете импортировать что угодно и использовать ее.

В дополнение к MyApp\setup.py вы пишете программу установки для пакета MyApp \ myapp. Используйте distutils, чтобы написать:

from distutils.core import setup 
setup(name='MyApp', 
     version='1.0', 
     description='My Beautiful Application', 
     author='Martin', 
     author_email='[email protected]', 
     url='http://stackoverflow.com/questions/1003843/', 
     packages=['myapp'], 
     scripts=['run.py'] 
    ) 

Этого достаточно. Теперь, когда люди загружают папку MyApp, они могут просто установить ее с помощью setup.py и запустить ее с помощью run.py. Distutils может генерировать пакеты в нескольких форматах, включая окна, устанавливаемые .EXE

Это стандартный способ распространения пакетов/приложений python.

0

GChartWrapper также доступен из PyPI, так что вы можете использовать easy_install или пип для установки модуля:

sudo pip install GChartWrapper==0.9 

Затем он будет автоматически добавлен в ваш PYTHONPATH, а затем вы можете удалить его из ваших/MYAPP/утилитов каталог. Если вы не можете использовать sudo, посмотрите на использование virtualenv (и virtualenvwrapper).

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