Python追踪栈指向不存在的文件

1 投票
3 回答
1145 浏览
提问于 2025-04-18 11:55

我正在尝试运行一个叫做 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 个回答

0

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)
2

这个问题是由 Pillow 引起的,你可以用 pip uninstall Pillow 这个命令来卸载它,这样这个问题就会消失了。

0

在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的文件夹。

撰写回答