有一个庞大的python项目,其中一个类的一个属性在某些地方只有错误的值.
它应该是sqlalchemy.orm.attributes.InstrumentedAttribute,但是当我运行测试时它是常量值,让我们说字符串.
有一些方法可以在调试模式下运行python程序,并在每个步骤之后自动执行一些检查(如果变量更改类型)吗?
PS我知道如何在inspect和property decorator的帮助下记录类实例属性的变化.可能在这里我可以使用这种方法与元类...
但有时我需要更一般和更强大的解决方案......
谢谢.
PPS我需要类似的东西:https://stackoverflow.com/a/7669165/816449,但可能会更详细地解释该代码中发生的事情.
要调试我在Heroku上看到但在本地计算机上没有看到的错误,我正在尝试进行逐步调试.
import pdb; pdb.set_trace()由于您无法访问连接到应用程序的控制台,因此典型方法不适用于Heroku,但显然您可以使用rpdb,即pdb的"远程"版本.
所以我安装了rpdb,import rpdb; rpdb.set_trace()在适当的位置添加.当我发出命中rpdb行的请求时,应用程序按预期挂起,我在heroku日志中看到以下内容:
pdb is running on 3d0c9fdd-c18a-4cc2-8466-da6671a72cbc:4444
Run Code Online (Sandbox Code Playgroud)
好的,那么如何连接到正在运行的pdb?我试图heroku run nc 3d0c9fdd-c18a-4cc2-8466-da6671a72cbc 4444从heroku的系统中尝试连接到命名主机,但只是立即退出状态1并且没有错误消息.
所以我的具体问题是:我现在如何连接到这个远程pdb?
一般相关的问题是:这是否是在Heroku上运行的应用程序的这种交互式调试的正确方法?有没有更好的办法?
注意:重庆CELERY:注意,我现在也尝试过与Celery类似的方法,但无济于事.默认主机celery的rdb(远程pdb包装器)使用的是localhost,当它是Heroku时你无法获得.我已经尝试将CELERY_RDB_HOST环境变量用于Heroku上托管的网站域,但是它提供了"无法分配请求的地址"错误.所以它是相同的基本问题 - 如何连接到在Heroku上运行的远程pdb实例?
我想运行pdb,逐步执行代码,并在某些时候更改某个名称指向的值.所以我可能想要更改名称'stationLat'指向的值.但似乎我做不到.这是一个例子:
>>> import extractPercentiles
>>> import pdb
>>> pdb.run( "extractPercentiles.extractOneStation()" )
> <string>(1)<module>()->None
(Pdb) s
--Call--
> /scratch/extractPercentiles.py(96)extractOneStation()
-> def extractOneStation() :
(Pdb) tbreak 132
Breakpoint 3 at /scratch/extractPercentiles.py:132
(Pdb) c
Deleted breakpoint 3
> /scratch/extractPercentiles.py(132)extractOneStation()
-> stationLon = float(stationLoc[3])
Run Code Online (Sandbox Code Playgroud)
所以现在我在一个我想改变stationlat价值的地方.Pdb似乎允许我将stationLat设置为新值,但是当我检查该值时,它保持不变:
(Pdb) stationLat
-34.171100000000003
(Pdb) stationLat = -40
(Pdb) stationLat
-34.171100000000003
(Pdb) !stationLat = -40
(Pdb) stationLat
-34.171100000000003
(Pdb)
Run Code Online (Sandbox Code Playgroud)
你可以看到我试过用!同样,没有成功.
pdb手册说我应该能够改变变量:
调试器无法识别的命令被假定为Python语句,并在被调试程序的上下文中执行.Python语句也可以带有感叹号(!)作为前缀.这是检查正在调试的程序的有效方法; 甚至可以更改变量或调用函数
这是范围问题吗?是否与我开始pdb的方式有关?我尝试了嵌入式"pdb.set_trace"习惯用法,我得到了相同的结果.
谢谢阅读.
我有一个运行Python 2.6.X的应用程序.以交互模式启动Python解释器(使用或不使用virtualenv):readline支持工作(命令历史记录).使用相同的Python解释器启动我的应用程序(virtualenv-ed或不使用):使用pdb.set_trace()时没有可用的readline支持:游标键不起作用.操作系统是Linux.
在开发Python包时,使用该-m选项在包内运行模块作为快速测试脚本非常方便.例如,对于somepackage其中的模块somemodule.py,调用
python -m somepackage.somemodule
Run Code Online (Sandbox Code Playgroud)
从somepackage将运行驻留的目录,somemodule.py就像子模块一样__main__.如果包是使用所描述的明确的相对进口使用该调用语法是特别重要的位置.
同样,使用-m选项来调试脚本也很方便,如
python -m pdb somescript.py
Run Code Online (Sandbox Code Playgroud)
有没有办法同时做两件事?也就是说,我可以将模块称为脚本并同时启动调试器吗?我意识到我可以进入代码本身并插入import pdb; pdb.set_trace()我想要破解的地方,但我试图避免这种情况.
有没有办法告诉 pdb 或 ipdb 跳过所有未来的断点并完成执行,就好像它们不存在一样?
最近,当使用设置断点时ipdb.set_trace(context=20),我可以看到我第一次输入的命令,按回车键后,下次我在 ipdb 提示符中写入指令或命令时不会显示。当我按回车键时,它会执行它并在前面的行中显示它。
直到最近才发生这种情况。我使用的是 mac,带有 iterm、最新的 ipdb 和 pytest。
编辑 2022-3-29
编辑 2022-3-31
编辑 2022-3-31 (2.0)
我正在使用 freezegun 1.2.1 和 pytest 6.2.5。当我运行此代码时,如果我执行 print 几次,光标就会消失。这是我能想到的最基本的复制测试。
导入ipdb
从 freezegun 导入 freeze_time
@freeze_time(“2022年3月12日”)
def test_prompt_ipdb():
ipdb.set_trace()
test_prompt_ipdb()
我现在相信这是这两个之一的错误,很可能是 freezegun 做了一些奇特的事情。
我正在使用PDB,如果我可以添加颜色的systax突出显示它会更好.
理想情况下,我希望代码的路径更轻一些.实际代码行将突出显示语法.
我正在使用OS X和终端应用程序.Python 2.7
我D:\symbols在Visual Studio选项中设置了符号缓存目录:

在这个目录中,Visual Studio创建了一个层次结构,顶层目录与PDB文件名相匹配(例如ole32.pdb),在下一层是一个或多个目录,如D0C3BDDD4ADD4E87B2B5E803303B8D772(看起来像33位十六进制数字),里面是PDB文件本身,大概是,从Microsoft Symbol Servers下载.
我想这些十六进制数字代表PDB文件的版本.我想知道,这些数字是否具有任何结构或含义,以及如何从PDB文件中提取它们(理想情况下,使用C#)?
给定其他文件夹中的PDB文件,是否可以在符号缓存中找到Visual Studio调试器所需的目录?