Как импортировать модуль из каталога на уровне выше текущего скрипта

для моего приложения 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).