rocky / python-xdis

Python cross-version bytecode library and disassembler
GNU General Public License v2.0
292 stars 95 forks source link

get_opcode_module fails to handle versions with 3 numbers #72

Closed olafhering closed 3 years ago

olafhering commented 3 years ago

Unclear how it is supposed to work. get_opcode_module fails to handle 3.6.12|3.8.6, and likely every 3.6.n|3.8.n.

$ uncompyle6 -h
Traceback (most recent call last):
  File "/usr/bin/uncompyle6", line 11, in <module>
    load_entry_point('uncompyle6==3.7.2', 'console_scripts', 'uncompyle6')()
  File "/usr/lib/python3.8/site-packages/pkg_resources/__init__.py", line 489, in load_entry_point
    return get_distribution(dist).load_entry_point(group, name)
  File "/usr/lib/python3.8/site-packages/pkg_resources/__init__.py", line 2852, in load_entry_point
    return ep.load()
  File "/usr/lib/python3.8/site-packages/pkg_resources/__init__.py", line 2443, in load
    return self.resolve()
  File "/usr/lib/python3.8/site-packages/pkg_resources/__init__.py", line 2449, in resolve
    module = __import__(self.module_name, fromlist=['__name__'], level=0)
  File "/usr/lib/python3.8/site-packages/uncompyle6/__init__.py", line 48, in <module>
    import uncompyle6.semantics.pysource
  File "/usr/lib/python3.8/site-packages/uncompyle6/semantics/pysource.py", line 141, in <module>
    from uncompyle6.parsers.treenode import SyntaxTree
  File "/usr/lib/python3.8/site-packages/uncompyle6/parsers/treenode.py", line 3, in <module>
    from uncompyle6.scanners.tok import NoneToken
  File "/usr/lib/python3.8/site-packages/uncompyle6/scanners/tok.py", line 200, in <module>
    NoneToken = Token("LOAD_CONST", offset=-1, attr=None, pattr=None)
  File "/usr/lib/python3.8/site-packages/uncompyle6/scanners/tok.py", line 86, in __init__
    from xdis.std import _std_api
  File "/usr/lib/python3.8/site-packages/xdis/std.py", line 220, in <module>
    _std_api = make_std_api()
  File "/usr/lib/python3.8/site-packages/xdis/std.py", line 218, in make_std_api
    return _StdApi(python_version, variant)
  File "/usr/lib/python3.8/site-packages/xdis/std.py", line 73, in __init__
    self.opc = opc = get_opcode_module(python_version, variant)
  File "/usr/lib/python3.8/site-packages/xdis/op_imports.py", line 169, in get_opcode_module
    return op_imports[canonic_python_version[vers_str]]
KeyError: '3.8.6'

Workaround is version_info[0:2] to find a match.

Unclear what the openSUSE Leap and Tumbleweed packages do wrong.

rocky commented 3 years ago

Seems to be duplicate of #71