python / python/cpython

linecache cannot read the source of modules imported from a .zip when given only the file name

未关闭
#157,146 1 条评论 0 个 reaction 已指派 1 人 在 GitHub 查看

@gpshead 已经在做这个了。

开始于 2026年9月8日。

stdlib type-bug
主要语言
Python
星标
77.2k
派生
35.9k
PR 合并指标
PR 指标待抓取

描述

Bug report

Bug description:

linecache.getlines(filename) and .getline(filename, lineno) return nothing for a module that was imported from a zip archive on sys.path via zipimport, unless the caller also passes module_globals.

For such modules, __file__ and .co_filename look like /path/to/archive.zip/pkg/mod.py. In linecache.updatecache(), the os.stat() on that path fails (NotADirectoryError), the lazy-loader lookup only works when module_globals is supplied, and the final fallback that searches sys.path only handles relative file names. So the lookup gives up and returns [].

Many callers only have the file name: pdb's list command, warnings (when the module globals are gone), doctest, inspect.getsourcefile() fallbacks, and traceback formatting of code objects whose frames have been cleared. For a file on disk these all work; for the same module inside a zip they silently show no source.

import linecache, sys, zipfile
with zipfile.ZipFile('mods.zip', 'w') as zf:
    zf.writestr('zipmod.py', 'def f():\n    return 1\n')
sys.path.insert(0, 'mods.zip')
import zipmod
print(linecache.getlines(zipmod.__file__))   # [] but should be the two source lines
print(linecache.getline(zipmod.f.__code__.co_filename,
                        zipmod.f.__code__.co_firstlineno))  # '' but should be 'def f():\n'

The information needed is already available: zipimport.zipimporter implements get_data(pathname), which accepts exactly these absolute paths, and sys.path_importer_cache maps the archive path to that importer.

Proposed fix: after the lazy-loader attempt fails, have updatecache() check whether the file name lies under a sys.path_importer_cache entry whose finder has get_data()...

This also benefits any other path entry finder that provides get_data() for an archive.

CPython versions tested on:

CPython main branch

Operating systems tested on:

Linux

Linked PRs
  • gh-157147
  • gh-157269

贡献指南

打开贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

评估

这个 Issue 还没有评估数据。

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。