РЕДАКТИРОВАТЬ: Решено! Решение в нижней части этого поста. tl; dr: я должен был использовать относительный импорт и запуск python с правильным флагом.
Так что я пытаюсь привыкнуть к некоторым вещам на Python (версия 2.7.3 - это то, что установлено на рабочем ПК), и у меня есть небольшой проект, чтобы научить меня некоторым вещам на Python. У меня есть модуль, определенный так:
curses_graphics
| __init__.py
| graphicsobject.py
| go_test.py
(следующий код)
У меня есть декоратор, определенный в __init__, и я пытаюсь использовать его в методах, определенных в классе в graphicsobject.py, к которому я пытаюсь присоединить декоратор, и я тестирую его функциональность в go_test.
Когда я запускаю go_test (просто находясь в каталоге и вызывая "python go_test.py"), я получаю сообщение об ошибке "пакет не найден". То же самое происходит, если я переименую go_test в __main__.py и попытаюсь запустить пакет из его родительского каталога. Если я попытаюсь запустить go_test без импорта пакета, он не распознает мою функцию.
Как я могу ссылаться на функцию, определенную в __init__.py, из одного пакета? Неправильно ли пытаться импортировать данные из пакета?
Спасибо!
__ init__.py:
import curses
import logging
#Define logging stuff
gLog = logging.getLogger("cg_log")
gLog.basicConfig(filename="log.log", level=logging.DEBUG)
# Logging decorators for this library
def debug_announce(module_func):
log=logging.getLogger("cg_log")
log.info("Curses Graphics Lib:Entering function:"+module_func.__name__)
module_func()
log.info("Curses Graphics Lib:Left function:"+module_func.__name__)
go_test.py
@debug_announce
def logTester():
print("A test method")
logTester()
logger.debug("Curses initialization")
screen=curses.initscr()
curses.start_color()
screen.keypad(True)
logger.debug("Initializing a green block filled with red '.'s")
block = GraphicsOBject.blankline(0, 0, 3, curses.COLOR_GREEN, curses.COLOR_RED, 20, '.')
logger.debug("Drawing the block.")
block.draw(screen)
logger.debug("Pausing execution with a getch")
screen.getch()
logger.debug("Cleaning up curses")
screen.keypad(False)
curses.endwin()
os.system('stty sane')
Я могу включить graphicsobject.py, хотя я подозреваю, что это будет хаотично, поскольку проблема возникает в первой строке go_test.py
Спасибо всем!
EDIT:
Я прилагаю захват сообщений об ошибках. В первой ошибке я добавил «из импорта debug_announce curses_graphics», а во второй код не имеет этой строки.
Ошибки с импортом debug_announce и без него
EDIT:
Дальнейшие поиски привели меня к относительному импорту . Для тех, у кого есть моя проблема, вы используете их для импорта чего-то определенного в вашем собственном модуле. В моем случае я добавил «from. Import debug_announce» в начало моего файла go_test.py. Я попытался запустить его и получил сообщение об ошибке «Попытка относительного импорта в неупакованном виде».
Дальнейшие поиски привели меня к этому вопросу:
Как исправить «Попытка относительного импорта в неупакованном виде» даже с __init __. Py
Который сказал мне, что он не пытался запустить эту программу как пакет. Это означало, что «__init__.py» никогда не запускался, так как пакет не был импортирован. Кроме того, поскольку я был внутри пакета, попытка импортировать пакет (т. Е. "Import curses_graphics") привела бы к его поиску внутри curses_graphics ... для curses_graphics.
Чтобы выполнить это правильно, как предполагает связанный вопрос, мне нужно перейти в родительский каталог curses_graphics и выполнить его с помощью «python -m curses_graphics.go_test». Это запускает пакет с его начальными элементами и так далее и запускает скрипт go_test.
(И, FWIW, у моего кода были другие проблемы. Не принимайте это как пример того, как использовать проклятия или ведение журнала: P)