Python追踪栈指向不存在的文件
我正在尝试运行一个叫做 setup.py
的脚本(用于 mnemosyne)。这个脚本出错了,我觉得我知道怎么解决这个问题,只要能找到那个需要修改的文件就行。问题是,错误信息指向了一个不存在的文件:
File "build/bdist.macosx-10.5-x86_64/egg/macholib/MachOGraph.py", line 49, in locate
loader=loader.filename)
TypeError: dyld_find() got an unexpected keyword argument 'loader'
我认为应该是 loader_path
。问题在于 MachOGraph.py
这个文件并不存在——在我当前的路径下找不到,也在我的 Anaconda 安装中找不到。虽然有一个 build/bdist.macosx-10.5-x86_64/
目录,但里面没有 egg
文件。我的系统上有几个 MachOGraph.py
文件,但它们都没有那一行代码。在这个目录下没有任何东西包含字符串 loader.filename
。
这是怎么回事?我该如何找到那个文件?
为了完整起见,这里是完整的错误信息:
Traceback (most recent call last):
File "/Users/mike/.continuum/anaconda/lib/python2.7/site-packages/ipdb/__main__.py", line 157, in main
pdb._runscript(mainpyfile)
File "/Users/mike/.continuum/anaconda/lib/python2.7/pdb.py", line 1233, in _runscript
self.run(statement)
File "/Users/mike/.continuum/anaconda/lib/python2.7/bdb.py", line 400, in run
exec cmd in globals, locals
File "<string>", line 1, in <module>
File "setup.py", line 241, in <module>
app = py2app_app
File "/Users/mike/.continuum/anaconda/lib/python2.7/distutils/core.py", line 151, in setup
dist.run_commands()
File "/Users/mike/.continuum/anaconda/lib/python2.7/distutils/dist.py", line 953, in run_commands
self.run_command(cmd)
File "/Users/mike/.continuum/anaconda/lib/python2.7/distutils/dist.py", line 972, in run_command
cmd_obj.run()
File "/usr/local/src/Mnemosyne-2.3.1/py2app-0.8.1-py2.7.egg/py2app/build_app.py", line 654, in run
self._run()
File "/usr/local/src/Mnemosyne-2.3.1/py2app-0.8.1-py2.7.egg/py2app/build_app.py", line 860, in _run
self.run_normal()
File "/usr/local/src/Mnemosyne-2.3.1/py2app-0.8.1-py2.7.egg/py2app/build_app.py", line 950, in run_normal
self.create_binaries(py_files, pkgdirs, extensions, loader_files)
File "/usr/local/src/Mnemosyne-2.3.1/py2app-0.8.1-py2.7.egg/py2app/build_app.py", line 1110, in create_binaries
platfiles = mm.run()
File "build/bdist.macosx-10.5-x86_64/egg/macholib/MachOStandalone.py", line 105, in run
mm.run_file(fn)
File "build/bdist.macosx-10.5-x86_64/egg/macholib/MachOGraph.py", line 84, in run_file
self.scan_node(m)
File "build/bdist.macosx-10.5-x86_64/egg/macholib/MachOGraph.py", line 110, in scan_node
m = self.load_file(filename, caller=node)
File "build/bdist.macosx-10.5-x86_64/egg/macholib/MachOGraph.py", line 93, in load_file
newname = self.locate(name, loader=caller)
File "build/bdist.macosx-10.5-x86_64/egg/macholib/MachOStandalone.py", line 23, in locate
newname = super(FilteredMachOGraph, self).locate(filename, loader)
File "build/bdist.macosx-10.5-x86_64/egg/macholib/MachOGraph.py", line 49, in locate
loader=loader.filename)
TypeError: dyld_find() got an unexpected keyword argument 'loader'
3 个回答
在 macholib1.7 中,从 **/MachOGraph.py** 文件的第46行开始:
try:
fn = dyld_find(filename, env=self.env,
executable_path=self.executable_path,
loader=loader.filename)
self.trans_table[(loader.filename, filename)] = fn
except ValueError:
return None
把第49行改成:
loader_path=loader.filename)
这个问题是由 Pillow 引起的,你可以用 pip uninstall Pillow
这个命令来卸载它,这样这个问题就会消失了。
在Python中,当你看到错误追踪信息时,它会显示出文件名,这个文件名是从字节码中提取出来的。字节码是Python程序在运行前的一种中间格式,它包含了程序的指令。在这个例子中,字节码里包含了一些文件名,这些文件名是为了生成一种叫做Python egg的格式而创建的,这种格式至少包含了字节码文件。这些路径反映了在构建这个包时的目录结构。
在这个例子中,使用的是py2app安装程序,它把macholib作为一个安装要求。setuptools会下载这个库的源代码,并根据需要生成一个egg,放在和py2app
egg相同的位置。我会去/usr/local/src/Mnemosyne-2.3.1/py2app-0.8.1-py2.7.egg
目录下找一个macholib-1.6-py2.7.egg
的文件夹。