vimer linux kernel 爱好者

python debug tips

2022-09-20

基本的调试命令

gdb -ex r --args python3 -m pytest -rsx -v -s src/sas/qtgui/Calculators/UnitTesting/GenericScatteringCalculator.py::Plotter3DTest

找出违规包(offending package)

该问题的thread在mail list。基本情况是,由于之前手动安装某个package(python),导致引发了setuptools的bug:

vimer@dev:~/build/rfs/packages/test_dir$ sudo pip3 install sphinxcontrib-ditaa
Collecting sphinxcontrib-ditaa
   Using cached sphinxcontrib-ditaa-1.0.1.tar.gz (7.5 kB)
   Preparing metadata (setup.py) ... error
   error: subprocess-exited-with-error

   × python setup.py egg_info did not run successfully.
    exit code: 1
   ╰─> [30 lines of output]
       Traceback (most recent call last):
         File "<string>", line 2, in <module>
         File "<pip-setuptools-caller>", line 34, in <module>
        File "/tmp/pip-install-c2wygkxs/sphinxcontrib-ditaa_10e1c64028af47e59b8fc5bf20b6901c/setup.py", line 8, in <module>
           setup(
        File "/usr/lib/python3/dist-packages/setuptools/__init__.py", line 86, in setup
           _install_setup_requires(attrs)
        File "/usr/lib/python3/dist-packages/setuptools/__init__.py", line 75, in _install_setup_requires
           dist = MinimalDistribution(attrs)
        File "/usr/lib/python3/dist-packages/setuptools/__init__.py", line 57, in __init__
           super().__init__(filtered)
        File "/usr/lib/python3/dist-packages/setuptools/dist.py", line 474, in __init__           for ep in metadata.entry_points(group='distutils.setup_keywords'):         File "/usr/lib/python3.10/importlib/metadata/__init__.py", line 1009, in entry_points
           return SelectableGroups.load(eps).select(**params)
        File "/usr/lib/python3.10/importlib/metadata/__init__.py", line 459, in load
           ordered = sorted(eps, key=by_group)
        File "/usr/lib/python3.10/importlib/metadata/__init__.py", line 1006, in <genexpr>
           eps = itertools.chain.from_iterable(
        File "/usr/lib/python3.10/importlib/metadata/_itertools.py", line 16, in unique_everseen
           k = key(element)
        File "/usr/lib/python3.10/importlib/metadata/__init__.py", line 941, in _normalized_name
           return self._name_from_stem(stem) or super()._normalized_name
        File "/usr/lib/python3.10/importlib/metadata/__init__.py", line 622, in _normalized_name
           return Prepared.normalize(self.name)
        File "/usr/lib/python3.10/importlib/metadata/__init__.py", line 871, in normalize
           return re.sub(r"[-_.]+", "-", name).lower().replace('-', '_')
         File "/usr/lib/python3.10/re.py", line 209, in sub
           return _compile(pattern, flags).sub(repl, string, count)
       TypeError: expected string or bytes-like object
       [end of output]

  note: This error originates from a subprocess, and is likely not a problem with pip.
error: metadata-generation-failed

× Encountered error while generating package metadata.
╰─> See above for output.

在肥猫老师的帮助下,这个问题很快解决了,主要是通过这个命令:

strace -eopenat python -c "from importlib.metadata import entry_points; print(entry_points(group='sphinx.builders'))"

这里的一个新鲜事物是strace,之前有用过这个命令,但是没想到还可以用在这里。这是这个bug带来的最大收获。其次,为什么这里可以通过entry_points找到触发问题的入口呢?这是我目前不理解的地方。


下一篇 Debian QA packages

Comments

Content