编辑:已解决!解决方案位于本文的底部。 tl; dr:我应该一直使用相对导入,并使用正确的标志启动python。
所以我试图适应一些python东西(版本2.7.3,这是工作PC上安装的东西),并且我有一个小项目来教我一些python东西。我已经定义了一个模块,如下所示:
curses_graphics
| __init__.py
| graphicsobject.py
| go_test.py
(后面的代码) 我已经在__init__中定义了一个装饰器,并且试图在我要附加装饰器的graphicsobject.py类的类中定义的方法上使用它,并在go_test中测试其功能。 / p>
当我运行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的第一行
谢谢大家!
编辑: 我附上所报告错误的摘要。在第一个错误中,我添加了“ from curses_graphics import debug_announce”,第二个代码中没有该行。
Errors with and without debug_announce import
编辑: 经过进一步的搜索,我找到了相对进口。对于遇到我问题的任何人,您都可以使用它们来导入您自己的模块中定义的内容。就我而言,我在go_test.py文件的开头附加了“ from。import debug_announce”。我尝试运行它,并收到错误消息“尝试以非包形式进行相对导入”。
一些进一步的搜索使我想到了这个问题: How to fix "Attempted relative import in non-package" even with __init__.py
告诉我,它不是试图以程序包形式运行该程序。这意味着“ __init__.py”从未运行过,因为该软件包不会被导入。此外,由于我在内部,因此尝试导入该软件包(即“ import curses_graphics”)会导致它在curses_graphics ...中搜索curses_graphics。
要正确运行此程序,如链接的问题所示,我需要转到curses_graphics的父目录,并使用“ python -m curses_graphics.go_test”执行该目录。这将使用其init等运行程序包,并运行go_test脚本。
(而且,FWIW,我的代码还有其他问题。请不要以此为例来说明如何使用curses或loging:P)