如何使用entry_point脚本启动调试器

时间:2017-08-29 04:55:03

标签: python

我在开发模式下使用pip install -e ./mylocalpkg安装了一个软件包。

此软件包定义了entry_points.console_script

setup(
    name='mylocalpkg',
    ...
    entry_points={
        'console_scripts': [
            'myscript = mylocalpkg.scriptfile:main'
        ]
    },
    ...
)

可以使用任何一种方式调用此脚本

$ python -m mylocalpkg.scriptfile
$ myscript

但是,我无法调试此脚本:

$ python -m pdb mylocalpkg.scriptfile
Error: mylocalpkg.scriptfile does not exist
$ python -m pdb myscript
Error: myscript does not exist

如何在调用entry_point脚本时使用pdb启动调试会话?

2 个答案:

答案 0 :(得分:5)

必须使用Python脚本的名称调用pdb模块,而不是模块。所以你需要给它一个脚本来运行。

如果您使用的是Linux / Unix / Mac,那么您很幸运,因为myscript实际上是一个Python脚本,因此您可以使用以下选项之一:

python -m pdb `which myscript`
# or
python -m pdb $(which myscript)

这些找到myscript的位置并将其传递给pdb模块。如果您碰巧知道,也可以直接指定myscript的位置。

如果您使用的是Windows,则需要创建一个加载entry_point的脚本,然后对其进行调试。这是一个可以完成这项工作的简短脚本:

# run_myscript.py
import pkg_resources
myscript = pkg_resources.load_entry_point('mylocalpkg', 'console_scripts', 'myscript')
myscript()

然后你可以通过这个命令进行调试:

python -m pdb run_myscript.py

或者,在任何平台上,你都可以使用这个丑陋的单行:

python -c "import pdb, pkg_resources; pdb.run('pkg_resources.load_entry_point(\'mylocalpkg\', \'console_scripts\', \'myscript\')()')"

答案 1 :(得分:0)

导致问题的原因之一不是源文件的安装位置,而是用于 import 语句的语法。

仅限 Python 2:

import submodule2

Python 2 和 3:

from . import submodule2

如果坚持后一种约定,它就“有效”。

最后,强烈推荐使用 pudb 进行目标调试。没有设置。只需安装即可。 (虽然,apt-install python3-pudb 比尝试将其安装在适当/相同的 venv 中更容易)

本地安装的轮子的示例命令行,命令行条目指向此文件,并显示脚本的参数:

pudb3 /opt/venv/xxx/lib/python3.8/site-packages/xxx/create_xxx.py  arg1 --database param1 --host hostbparam.com -