ошибка импорта Python - PullRequest
       9

ошибка импорта Python

4 голосов
/ 21 августа 2010

что не так с моим импортом?

Структура папки приложения:

myapp /

  • models / models.py содержит SpotModel()
  • tests / tests.py содержит TestSpotModel (unittest.TestCase).tests.py import from myapp.models.models import *, который работает как шарм
  • scripts / import.py содержит from myapp.models.models import *

, проблема в том, что import.py при выполнении приводит к ошибке:

ImportError: No module named myapp.models.models

, но tests.py запускается.

У меня есть __init__.py файлы в myapp/__init__.py, myapp/models/__init__.py, myapp/tests/__init__.py и, как уже упоминалось, выполнение модульных тестов с использованием тестов на носкак и предполагалось.

Ответы [ 4 ]

4 голосов
/ 21 августа 2010

Это __init__.py, а не init.py. Убедитесь, что каждый каталог в иерархии содержит его для возможности импорта.

РЕДАКТИРОВАТЬ: Мне удалось воспроизвести его. Вот структура каталогов:

cesar@cesar-laptop:/tmp/asdasd$ tree
.
`-- myapp
    |-- __init__.py
    |-- models
    |   |-- __init__.py
    |   `-- models.py
    |-- scripts
    |   |-- data.py
    |   `-- __init__.py
    `-- tests
        |-- __init__.py
        `-- tests.py

Я поместил следующий код в самом начале data.py, чтобы сузить проблему:

import sys
import pprint

pprint.pprint(sys.path)

from myapp.models.models import *

Запуск data.py способом, указанным OP, приводит к ImportError:

cesar@cesar-laptop:/tmp/asdasd$ python myapp/scripts/data.py
['/tmp/asdasd/myapp/scripts',
 '/usr/lib/python2.6',
 '/usr/lib/python2.6/plat-linux2',
 '/usr/lib/python2.6/lib-tk',
 -- Skipped --
'/usr/local/lib/python2.6/dist-packages']
Traceback (most recent call last):
  File "myapp/scripts/data.py", line 6, in 
    from myapp.models.models import *
ImportError: No module named myapp.models.models

Но этот способ работает как шарм:

cesar@cesar-laptop:/tmp/asdasd$ python -m myapp.scripts.data
['',
 '/usr/lib/python2.6',
 '/usr/lib/python2.6/plat-linux2',
 '/usr/lib/python2.6/lib-tk',
 -- Skipped --
'/usr/local/lib/python2.6/dist-packages']

Обратите внимание на разницу в первой записи sys.path.

1 голос
/ 21 августа 2010

Ваш sys.path явно не настроен одинаково, когда вы запускаете тест и когда вы запускаете скрипт. У

import sys
print(sys.path)

вверху обоих модулей, чтобы подтвердить это. Затем исправьте ошибку (добавьте к sys.path родительский каталог myapp в случае, если он отсутствует.

1 голос
/ 21 августа 2010

Как вы выполняете import.py? Каков текущий рабочий каталог, когда вы это делаете?

Каталог myapp должен находиться на пути Python (т. Е. Внутри одного из каталогов, перечисленных в sys.path), чтобы вы могли import его. Python автоматически добавляет текущий рабочий каталог в список путей во время запуска интерпретатора.

Таким образом, если каталог, содержащий myapp, не добавлен в путь вручную (например, с помощью переменной среды PYTHONPATH или при добавлении его в sys.path в sitecustomize.py), вам необходимо будет каталог, содержащий myapp при запуске скрипта. Если вы находитесь внутри самого каталога myapp, вы не сможете импортировать пакет myapp.

0 голосов
/ 21 августа 2010

Если вы не забыли упомянуть об этом, у вас нет __init__.py в myapp/scripts, поэтому myapp/scripts/import.py не является модулем myapp.

Если myapp не находится в вашемкаким-то образом глобальный путь, скрипт не может его найти, потому что он не будет искать его в нужном месте.

Либо сделайте папку с вашими скриптами модулем, добавив к ней __init__.py, переместите скриптывверх по иерархии файловой системы (либо в myapp, либо в ее родительскую папку), либо установите myapp в свой путь (т. е. переместите его в папку packages, например, /usr/lib/python2.6/dist-packages/).

...