python2.7调试使用不同的行为不那么调试(python2.7 using debug beha

2019-10-20 17:47发布

我有一个错误在我的计划,并希望将其签出使用调试。 在我的IDE(WingIDE)我有一个调试功能。 但我不能使用电话从外壳程序。 所以我使用Python模块PDB。 我的应用程序是单线程的。

我已研究过的代码是不同的行为在发布VS调试模式 ,但似乎不同的东西给我。

我有限的IT沿着这下面的代码。

我做了什么 :

我创建了一个短方法不使用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')                            

说明。 我想打电话给子与超时。 对于Python 3.3+它是建立在,但我的应用程序能够使用Python2.7也运行。 所以我用https://pypi.python.org/pypi/subprocess32/3.2.6作为一个补丁包。 要读取返回值我曾经如何从子有用的结果?
如果没有超时,设置超时FE 1秒的方法按预期工作。 的结果值和“否超时”被打印出来。

我要强制超时,所以我设置的时间很短的时间0.001。 所以,现在只有“TimeoutExpired”应打印。

我想执行这个壳。 当如果第一评论出线#set_pdb_trace()“TimeoutExpired”被印刷,所以预期行为。

现在我去掉set_pdb_trace(),并在命令行下执行。

调试器显示器,我按“C”(继续)和“不超时”,结果被打印。 这个结果是没有调试不同的,那么。 所述产生输出为:

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$ 

这怎么可能? 如何解决?

Answer 1:

您介绍打开子和写入它之间的延迟。

当您创建Popen()对象,子进程将立即开始。 当你再调用p.communicate()并尝试写它,这个过程尚未完全准备就绪接收输入,并与时间延迟在一起才能读取进程输出比你的0.0.1超时时间长。

当您插入断点,过程都有机会旋转起来; 的lsb_release命令不等待输入,并立即产生其输出。 到时候p.communicate()被调用,无需等待管了,输出会立即产生。

如果你之前把你的断点Popen()调用,然后打c ,你会再次看到超时触发。



文章来源: python2.7 using debug behave different then without debug