Как импортировать модуль из каталога на уровне выше текущего скрипта
для моего приложения Python у меня есть следующая структура каталогов:
myapp
myapputils
myapputilsGChartWrapper
myappmodel
myappview
myappcontroller
один из моих классов в myappview должен импортировать класс с именем 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...
5 ответов
на пакета GChartWrapper ожидает пакет GChartWrapper на PYTHONPATH. Вы можете сказать по первой строке:
from GChartWrapper.GChart import *
необходимо ли включать пакет GChartWrapper в структуру каталогов пакетов?
Если это так, то одна вещь, которую вы можете сделать, это добавить путь, где находится пакет в sys.путь во время выполнения. Я беру его myview.py
- в
вы не импортируете модули и пакеты из arbritary путей. Вместо этого в python вы используете пакеты и абсолютный импорт. Это позволит избежать всех будущих проблем.
пример:
создать следующие файлы:
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='martin@xxxxxxx.com',
url='http://stackoverflow.com/questions/1003843/',
packages=['myapp'],
scripts=['run.py']
)
этого вполне достаточно. Теперь, когда люди загружают папку MyApp, они могут просто установить ее, используя setup.py и запустите его, используя run.py - ... Distutils может создавать пакеты в нескольких форматах, включая Windows, устанавливаемые .EXE
это стандартный способ распространения пакетов/приложений python.
вы можете изменить путь, по которому python ищет файлы.
в верхней части исходного файла, добавьте:
import sys
sys.path.append("..")
или альтернативно измените переменную окружения:
export PYTHONPATH=..
или начиная с python 2.5 (снова предполагая, что myview находится в myapp\view:
from __future__ import absolute_import
from ..utils.GChartWrapper import *
см.: http://docs.python.org/whatsnew/2.5.html#pep-328-absolute-and-relative-imports
GChartWrapper также доступен из PyPI, поэтому вы можете использовать easy_install или pip для установки модуля:
sudo pip install GChartWrapper==0.9
затем он будет автоматически добавлен в ваш PYTHONPATH, а затем вы можете удалить его из каталога/myapp / utils. Если вы не можете использовать sudo, посмотрите на использование virtualenv (и virtualenvwrapper).