Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用调试的python2.7与不使用调试的python2.7表现不同_Python_Shell_Debugging_Subprocess - Fatal编程技术网

使用调试的python2.7与不使用调试的python2.7表现不同

使用调试的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:

我的程序中有一个bug,想用debug检查一下。在我的IDE(WingIDE)中,我有一个调试功能。但是我不能用这个从shell调用程序。所以我使用Python模块pdb。我的应用程序是单线程的

我已经调查过了,但这对我来说似乎有些不同

我将其限制在以下代码中

我所做的:

我创建了一个短方法,只有在不使用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。