在打开特定文件时打破python代码

时间:2015-05-26 21:51:30

标签: python debugging

我想在调试器下运行代码并在打开文件时停止它。无论打开文件的技术如何,我都希望这样做。 AFAIK有两种打开文件的方式(如果还有更多,那么我想在这种情况下也停止代码)并且我想在其中一个执行时停止代码:

with open(filename, "wb") as outFile:

object = open(file_name [, access_mode][, buffering])

这可以在pdbipdb

下进行

PS:如果我知道我可以手动设置断点,我不知道文件被打开的行。我也可以grep open(并在找到的行上设置断点,但如果我的代码使用模块,这可能会有问题。此外,如果文件以另一种方式打开而不是open(我不知道这是否可能只是猜测,也许是为了附加等),这将无效。

2 个答案:

答案 0 :(得分:2)

理想情况下,你会在open builtin函数中放置一个断点,但这是不可能的。相反,您可以覆盖它,并将断点放在那里:

import __builtin__

def open(name, mode='', buffer=0):
    return __builtin__.open(name, mode, buffer) # place a BreakPoint here

当然,你会打开任何文件,而不仅仅是你想要的文件。

所以你可以改进一下并放置一个条件断点:

import ipdb
import __builtin__

def open(name, mode='', buffer=0):
    if name == 'myfile.txt':
        ipdb.set_trace()  ######### Break Point ###########
    return __builtin__.open(name, mode, buffer)

f = open('myfile.txt', 'r')

使用python -m pdb prog.py运行您的python程序。

答案 1 :(得分:2)

如果您不知道公开电话的位置,您需要尽可能早地修补原始open(例如__main__ - 后卫),如下所示:

 import __builtin__

 _old_open = open

 def my_open(*args, **kwargs):
     print "my_open"
     return _old_open(*args, **kwargs)

 setattr(__builtin__, 'open', my_open)

 print open(__file__, "rb").read()