Как импортировать модуль из каталога на уровне выше текущего скрипта - PullRequest
10 голосов
/ 17 июня 2009

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

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

Один из моих классов в \ myapp \ view \ должен импортировать класс с именем 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 ]

7 голосов
/ 17 июня 2009

Файл __init__.py пакета 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.

5 голосов
/ 17 июня 2009

Вы не импортируете модули и пакеты из произвольных путей. Вместо этого в 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='/871770/kak-importirovat-modul-iz-kataloga-na-urovne-vyshe-tekuschego-skripta',
      packages=['myapp'],
      scripts=['run.py']
     )

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

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

2 голосов
/ 17 июня 2009

Или начиная с 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

2 голосов
/ 17 июня 2009

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

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

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

Или альтернативно измените переменную среды:

export PYTHONPATH=..
0 голосов
/ 14 апреля 2011

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

sudo pip install GChartWrapper==0.9

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

...