【发布时间】:2015-01-27 09:41:36
【问题描述】:
我正在将一个巨大的 py 模块重构为包 - 为了不破坏现有代码,我将其内容移动到 package/__init__.py 模块 (Adding code to __init__.py) 并继续从那里拆分它。我注意到在我的回溯中我得到了:
Traceback (most recent call last):
File "<string>", line 656, in DoItemMenu
File "bash\balt.py", line 2109, in PopupMenu
link.AppendToMenu(menu,parent,*args)
File "bash\balt.py", line 2225, in AppendToMenu
for link in self.links: link.AppendToMenu(subMenu,window,data)
...
File "<string>" 中的行对应于特定的package/__init__.py 模块。此外,PyCharm 的调试器会显示“框架不可用”行,并且不会进入 __init__.py 中的行。为什么?是否与导入模式有关?
代码由launcher class导入:
class UnicodeImporter(object):
def find_module(self,fullname,path=None):
if isinstance(fullname,unicode):
fullname = fullname.replace(u'.',u'\\')
exts = (u'.pyc',u'.pyo',u'.py')
else:
fullname = fullname.replace('.','\\')
exts = ('.pyc','.pyo','.py')
if os.path.exists(fullname) and os.path.isdir(fullname):
return self
for ext in exts:
if os.path.exists(fullname+ext):
return self
def load_module(self,fullname):
if fullname in sys.modules:
return sys.modules[fullname]
else:
sys.modules[fullname] = imp.new_module(fullname)
if isinstance(fullname,unicode):
filename = fullname.replace(u'.',u'\\')
ext = u'.py'
initfile = u'__init__'
else:
filename = fullname.replace('.','\\')
ext = '.py'
initfile = '__init__'
if os.path.exists(filename+ext):
try:
with open(filename+ext,'U') as fp:
mod = imp.load_source(fullname,filename+ext,fp)
sys.modules[fullname] = mod
mod.__loader__ = self
return mod
except:
print 'fail', filename+ext
raise
mod = sys.modules[fullname]
mod.__loader__ = self
mod.__file__ = os.path.join(os.getcwd(),filename)
mod.__path__ = [filename]
#init file
initfile = os.path.join(filename,initfile+ext)
if os.path.exists(initfile):
with open(initfile,'U') as fp:
code = fp.read()
exec code in mod.__dict__
return mod
【问题讨论】:
-
这意味着 Python 被告知从字符串编译该模块;这可能是 PyCharm 的错,而不是 Python。
-
您目前运行这段代码的具体情况如何?
-
@MartijnPieters: here 是启动器 - 我几乎可以肯定,在我将文件复制粘贴到
basher/__init__.py之前,它没有加载字符串...... -
不,我的意思是 PyCharm 指示 Python 解释器从字符串运行该文件,而不是要求 Python 将其作为模块导入。我没有说模块本身做了什么。
-
@MartijnPieters:当我直接运行启动器时也会发生这种情况 - 我提到了 Pycharm,因为在我看来,这与它无法单步执行
__init__.py中的代码的原因相同
标签: python python-2.7 python-import traceback