Ошибка «ImportError: модуль без имени» не связана с моим кодом - PullRequest
4 голосов
/ 09 сентября 2011

Я пытаюсь выполнить Упражнение 47 из Изучить Python The Hard Way, 2nd Edition , но я получаю эту ошибку при запуске tests/ex47_tests.py:

File "tests/ex47_tests.py", line 3, in <module>
    from ex47.game import Room
ImportError: No module named ex47.game

Я подумал, что я что-то не так делал в своем коде, потому что я новичок в этом, поэтому я клонировал это репо от пользователя GitHub, который, кажется, успешно выполнил упражнение.

Мало того, что соответствующие части нашего кода идентичны, но я получаю ту же ошибку, когда пытаюсь запустить tests/ex47_tests.py, который я клонировал от него.Так что теперь я потерялся и надеюсь, что у кого-то есть решение для меня.Есть идеи?

Ответы [ 6 ]

5 голосов
/ 09 сентября 2011

fabrizioM ответ должен заставить его работать. Вот небольшое объяснение.

Когда Python загружает файл, он выполняет поиск в файловой системе. Итак, у нас есть оператор импорта:

from ex47.game import Room

Он ищет файл ex47.py в пути поиска модулей (доступный как sys.path в коде Python). Путь поиска модулей содержит некоторые каталоги, основанные на деталях установки Python, каталоги, перечисленные в переменной среды PYTHONPATH, и содержит родительский каталог выполняемого вами сценария. Он не находит ex47.py по пути, но видит, что есть каталог с именем ex47 с __init__.py внутри него. Затем он находит game.py в этой папке.

Проблема в том, что ваша текущая папка не находится в пути поиска модулей. Поскольку ex47_tests.py был запущен, на пути к нему есть $ cwd / tests. Вам нужен $ cwd на пути.

PYTHONPATH=. python tests/ex47_tests.py

делает именно это. Он помещает $ cwd в путь поиска модулей, чтобы Python мог найти исходные файлы.

Вы также можете сделать:

python -m tests.ex47_tests

Это будет запускать его как модуль вместо файла, в то время как он будет использовать текущий каталог в качестве пути, который он автоматически добавляет к пути поиска модулей вместо каталога, в котором находится файл.

3 голосов
/ 20 февраля 2015

Книга просит вас скопировать каталог 'skeleton', а затем использовать его для упражнения в игровой комнате (# 47).Каталог скелета имеет каталог "NAME".

Таким образом, если вы скопировали каталог скелета и назвали его ex47, у вас будет еще один каталог ex47 внутри него.простой файл ex47 / game.py, куда вы можете поместить код для проверки", вы предполагаете, что это верхний уровень ex47.Неправильно!Вот почему импорт не будет разрешен.

Я сталкивался с той же проблемой, пока не понял, что книга называет внешний каталог (тот, который мы получили, копируя «скелет») как «простое имя», как видно из этой строки в книге -

~/projects/simplegame $ nosetests

Так что все ответы о PYTHONPATH верны, я просто хотел объяснить, почему импорт не будет работать для вас!

3 голосов
/ 09 сентября 2011

из каталога репозитория:

PYTHONPATH=. python tests/ex47_tests.py

Убедитесь, что на вашем пути нет других файлов / пакетов ex47.py.

1 голос
/ 17 июня 2013

Что-то не так с вашей структурой каталогов. Вот моя структура каталогов:

bin  docs  ex47  setup.py  tests

./bin:

./docs:

./ex47:
game.py  game.pyc  __init__.py  __init__.pyc

./tests:
ex47_tests.py  ex47_tests.pyc  __init__.py  __init__.pyc
0 голосов
/ 28 декабря 2017

У меня тоже была такая же ошибка;будучи новичком в python, я последовал примеру книги и, скопировав каталог скелетов, переименовал все файлы, содержащие «NAME» - один существовал в каталоге test /, а однажды удалил невозможную загрузку, исчезла ошибка - проверьте ответ / содержимое в Microivanкаталог пост выше.Таким образом, в каталоге проекта должны существовать только два файла python, game.py и ex47_tests.py - надеюсь, вы добрались до следующего упражнения. !!

0 голосов
/ 18 июня 2017

Проект с именем ex47, и в нем есть папка с именем ex47. (при условии, что вы назвали свои файлы в соответствии с его планом, изложенным перед кодом файла game.py в этом упражнении) Когда автор говорит создать простой файл ex47 / game.py, он имеет в виду папку, в которой должен быть создан и сохранен файл game.py.

...