使用调试的python2.7与不使用调试的python2.7表现不同
我的程序中有一个bug,想用debug检查一下。在我的IDE(WingIDE)中,我有一个调试功能。但是我不能用这个从shell调用程序。所以我使用Python模块pdb。我的应用程序是单线程的 我已经调查过了,但这对我来说似乎有些不同 我将其限制在以下代码中 我所做的: 我创建了一个短方法,只有在不使用IDE的情况下才会调用它使用调试的python2.7与不使用调试的python2.7表现不同,python,shell,debugging,subprocess,Python,Shell,Debugging,Subprocess,我的程序中有一个bug,想用debug检查一下。在我的IDE(WingIDE)中,我有一个调试功能。但是我不能用这个从shell调用程序。所以我使用Python模块pdb。我的应用程序是单线程的 我已经调查过了,但这对我来说似乎有些不同 我将其限制在以下代码中 我所做的: 我创建了一个短方法,只有在不使用IDE的情况下才会调用它 def set_pdb_trace(): run_in_ide = not sys.stdin.isatty() if not run_in_ide:
def set_pdb_trace():
run_in_ide = not sys.stdin.isatty()
if not run_in_ide:
import pdb; pdb.set_trace() # use only in python interpreter
这个作品很好,我在很多场合都用过
我要调试以下方法:
import sys
import os
import subprocess32
def call_backported():
command = 'lsb_release -r'
timeout1 = 0.001 # make value too short, so time-out will enforced
try:
p = subprocess32.Popen(command, shell=True,
stdout=subprocess32.PIPE,
stderr=subprocess32.STDOUT)
set_pdb_trace()
tuple1 = p.communicate(input=b'exit %errorlevel%\r\n', timeout=timeout1)
print('No time out')
value = tuple1[0].decode('utf-8').strip()
print('Value : '+ value)
except subprocess32.TimeoutExpired, e:
print('TimeoutExpired')
解释。
我想用超时调用子进程。对于Python3.3+来说,它是内置的,但是我的应用程序也可以使用Python2.7运行。所以我用它作为后端口。
读取我使用的返回值如果没有超时,将超时设置为f.e.1秒,则该方法将按预期工作。打印结果值和“无超时” 我想强制执行超时,所以我将超时设置为非常短的时间0.001。因此,现在只应打印“TimeoutExpired” 我想执行这个是shell。 如果打印了第一行注释#set_pdb_trace()'TimeoutExpired',则为预期行为 现在我取消对set_pdb_trace()的注释并在shell中执行 调试器显示,我按“c”(继续)和“No timeout”(无超时),打印结果。此结果与未进行调试时的结果不同。生成的输出是:
bernard@bernard-vbox2:~/clones/it-should-work/unit_test$ python test_subprocess32.py
--Return--
> /home/bernard/clones/it-should-work/unit_test/test_subprocess32.py(22)set_pdb_trace()->None
-> import pdb; pdb.set_trace() # use only in python interpreter
(Pdb) c
No time out
Value : Release: 13.10
bernard@bernard-vbox2:~/clones/it-should-work/unit_test$
这怎么可能?如何解决呢?您在打开子流程和写入子流程之间引入了延迟 创建
Popen()
对象时,子进程立即启动。然后调用p.communicate()
并尝试写入时,进程尚未完全准备好接收输入,该延迟加上读取进程输出所需的时间长于0.0.1超时
当插入断点时,进程有机会加速;lsb_release
命令不等待输入,而是立即生成输出。调用p.communicate()
时,无需再等待管道,立即生成输出
如果您将断点放在调用
Popen()
之前,然后点击c
,您将再次看到超时触发器。@martijn pieters No on Ubuntu,Release:13.10输入c
时会打印什么?当你到达断点时,你能在终端中包含一个输出吗?@martijn pieters我在原始问题中添加了这个。就是这样。Popen和p.communicate是相关的。这意味着我必须小心地将调试语句放在哪里。这种行为与我的IDE中的行为相同。所以调试和不调试之间没有真正的区别。谢谢Martijn。