2016-01-08 4 views
4

После установки моего питона проекта с setup.py и выполнение его в терминале я получаю следующее сообщение об ошибке:Python ImportError после setup.py

... 
from ui.mainwindow import MainWindow 
    File "/usr/local/lib/python2.7/dist-packages/EpiPy-0.1-py2.7.egg/epipy/ui/mainwindow.py", line 9, in <module> 
    from model.sir import SIR 
ImportError: No module named model.sir 

...

Предположим, мы имеем следующую структуру нашего проект cookies:

. 
├── setup.py 
└── src 
    ├── a 
    │   ├── aa.py 
    │   └── __init__.py 
    ├── b 
    │   ├── bb.py 
    │   └── __init__.py 
    ├── __init__.py 
    └── main.py 

Файл: cookies/src/main.py

from a import aa 

def main(): 
    print aa.get_aa() 

Файл cookies/src/a/aa.py

from b import bb 

def get_aa(): 
    return bb.get_bb() 

Файл: cookies/src/b/bb.py

def get_bb(): 
    return 'bb' 

Файл: cookies/setup.py

#!/usr/bin/env python 

import os 
import sys 

try: 
    from setuptools import setup, find_packages 
except ImportError: 
    raise ImportError("Install setup tools") 

setup(
    name = "cookies", 
    version = "0.1", 
    author = "sam", 
    description = ("test"), 
    license = "MIT", 
    keywords = "test", 
    url = "[email protected]", 
    packages=find_packages(), 
    classifiers=[ 
    """\ 
    Development Status :: 3 - Alpha 
    Operating System :: Unix 
    """ 
    ], 
    entry_points = {'console_scripts': ['cookies = src.main:main',],}, 
) 

Если установить cookies в root с $ python setup.py install и выполнить cookies Я получаю следующее сообщение об ошибке: ImportError: No module named b. Как я могу решить проблему.

+0

Является ли пакет, который вы импортируете (или его родительский каталог) в PYTHONPATH? – tuned

+0

нет, только '['', '/usr/local/lib/python2.7/dist-packages/EpiPy-0.1-py2.7.egg', '/usr/local/lib/python2.7/dist- пакеты/peppercorn-0.5-py2.7.egg ', ...] '. Папка EpiPy-0.1-py2.7.egg включает следующие пакеты: 'EGG-INFO' и' epipy' ' – Sam

+0

https://docs.python.org/2.5/whatsnew/pep-328.html Вы должны использовать 'из .model.sir импорта SIR' –

ответ

3

Что я буду делать, это использовать абсолютный импорт во всем мире (из импорта эпипии ...). Это то, что рекомендуется в PEP 328.

Ваш импорт больше не будет работать, если проект не установлен. Вы можете добавить директорию проекта к вашему PYTHONPATH, установите пакет, или то, что я делаю, когда я нахожусь в середине развивающихся пакетов, install with the 'editable' option: pip install -e

В режиме редактирования вместо установки кода пакета в вашем питона дистрибутива, создается указатель на ваш проект. Таким образом, он является импортируемым, но пакет использует живой код в разработке.

Пример:

Я разрабатывает пакет в/дома/jbchouinard/MyPackage. Внутри моего кода я использую абсолютный импорт, например. from mypackage import subpackage.

Если я установил с pip install, пакет будет установлен в моем дистрибутиве, скажем в /usr/lib/python2.7/dist-packages. Если я сделаю дальнейшие изменения в пакете, я должен обновить или удалить/переустановить пакет. Это может стать утомительным быстро.

Если я устанавливаю с pip install -e, указатель (.pth файл) создается в/usr/lib/python2.7/dist-packages в/home/jbchouinard/mypackage. Я могу import mypackage, как если бы он был установлен нормально, но используемым кодом является код в/home/jbchouinard/mypackage; любое изменение немедленно отражается.

+0

Спасибо, ваше примечание 'pip install -e' было очень полезно. Теперь я использую структуру импорта 'package.subpackage.module' ->' epipy.model.sir'. – Sam

1

У меня была аналогичная проблема с одним из моих проектов. Я смог решить свою проблему, добавив эту строку в начале моего модуля (перед всеми импортами, кроме sys & os, которые необходимы для этой вставки), так что она будет включать родительскую папку и тем самым она будет быть в состоянии увидеть родительскую папку (оказывается, это не делает это по умолчанию):

import sys 
import os 
sys.path.insert(1, os.path.join(sys.path[0], '..')) 
# all other imports go here... 

Таким образом, ваш main.py будет включать в родительскую папку (epipy). Дайте это попробовать, надеюсь, что это поможет :-)

+0

Что вы имеете в виду с 'началом моего модуля', вы имеете в виду' epipy/__ init __. Py'? – Sam

+0

Я имею в виду в верхней части вашего файла, перед всеми другими импортами. Я обновил свой ответ, чтобы сделать его более понятным. –

+0

Я обновил свой вопрос – Sam

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