if not sys.argv[1:] or sys.argv[1] in ("--help", "-h"):
print "usage: pdb.py scriptfile [arg] ..."
sys.exit(2)
mainpyfile = sys.argv[1] # Get script filename
if not os.path.exists(mainpyfile):
print 'Error:', mainpyfile, 'does not exist'
sys.exit(1)
del sys.argv[0] # Hide "pdb.py" from argument list
# Replace pdb's dir with script's dir in front of module search path.
sys.path[0] = os.path.dirname(mainpyfile)
# Note on saving/restoring sys.argv: it's a good idea when sys.argv was
# modified by the script being debugged. It's a bad idea when it was
# changed by the user from the command line. There is a "restart" command
# which allows explicit specification of command line arguments.
pdb = Pdb()
while True:
try:
pdb._runscript(mainpyfile)
6条答案
按热度按时间6ss1mwsb1#
现在不能执行此操作,因为
-m
会终止选项列表这意味着解释参数列表的其余部分是mod的工作,并且此行为完全取决于mod的内部设计以及它是否支持另一个**-m**
让我们看看在python 2.x的pdb中发生了什么。实际上,没有什么有趣的,它只需要提供一个脚本名称:
当前发布的python 3.x版本相同
喜讯
允许执行您所请求操作的pull请求在5天前为merged。多么神秘的巧合!这是密码
因此,只需等待即将到来的python3.x版本解决此问题即可)
qni6mghb2#
Python 3.7增加了该功能
在the docs中,看起来你的命令:
将开始在Python 3.7上工作:
版本3.7中的新功能:pdb.py现在接受一个-m选项,它执行模块的方式与python3 -m类似。与脚本一样,调试器将在模块的第一行之前暂停执行。
在Ubuntu 23.10、Python 3.11.2上测试:
main.py
然后:
导致:
wfypjpf43#
下面的脚本将运行一个模块,如果在运行该模块时发生异常,则会中断到事后调试。它应该可以在Python 2.7和3.x中工作。
用法:
已知限制:
sys.argv[0]
被保留为模块名称,而不是解析为模块的文件路径。mdb.py
演示:
xuo3flqw4#
您可以在代码中添加
pdb.set_trace()
以进行交互式调试,然后添加要调试的代码。运行这个将输出
并让你使用python调试器。
zbwhf8kr5#
正如其他人所说,这个特性是在Python 3.7中添加的。然而,人们仍然在使用旧版本,所以希望下面的解决方案可以帮助这些人!
基本上,你可以创建一个脚本来运行这个模块,只需要导入这个包的
__main__.py
文件:然后在pdb下运行该脚本:
python -m pdb runner.py [args]
。此解决方案适用于相对导入(因为
__main__
在包路径下运行,而不是作为脚本调用)。只需要导入
__main__
模块的原因是Python导入会触发要执行的顶层代码,而在__main__
中,逻辑是在顶层执行的。bqujaahr6#
根据
python
命令行手册页,-m标志执行以下操作:在sys.path中搜索指定模块,并将相应的.py文件作为脚本运行。
考虑到这一点,我会很有信心通过运行.py文件来进行调试,就像您的第一个示例一样。需要记住的一点是-m搜索
sys.path
。幸运的是,python首先会查看当前的工作目录,所以只要你正在调试的.py在你的cwd中,python -m module
和python module.py
就等价。