打开特定文件时破坏 python 代码
Breaking the python code when particular file is being opened
我想 运行 在调试器下编写代码并在打开文件时停止它。无论打开文件的技术如何,我都想这样做。据我所知,有两种打开文件的方法(如果有更多,那么我也想在这种情况下停止代码)并且我想在执行其中一种时停止代码:
with open(filename, "wb") as outFile:
或
object = open(file_name [, access_mode][, buffering])
这在 pdb
或 ipdb
下可能吗?
PS:如果我知道我可以手动设置断点,我不知道打开文件的行。我也可以 grep
for open(
并在找到的行上设置断点,但如果我的代码使用模块,这可能会有问题。此外,如果文件不是通过 open
以另一种方式打开的(我不知道这是否可能只是猜测,也许是为了追加等),这是行不通的。
理想情况下,您应该在 open 内置函数中放置一个断点,但这是不可能的。相反,您可以覆盖它,并将断点放在那里:
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 程序 python -m pdb prog.py
.
如果您不知道打开的调用在哪里,您需要在尽可能早的点(例如 __main__
-guard)修补原始的 open
,如下所示:
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()
我想 运行 在调试器下编写代码并在打开文件时停止它。无论打开文件的技术如何,我都想这样做。据我所知,有两种打开文件的方法(如果有更多,那么我也想在这种情况下停止代码)并且我想在执行其中一种时停止代码:
with open(filename, "wb") as outFile:
或
object = open(file_name [, access_mode][, buffering])
这在 pdb
或 ipdb
下可能吗?
PS:如果我知道我可以手动设置断点,我不知道打开文件的行。我也可以 grep
for open(
并在找到的行上设置断点,但如果我的代码使用模块,这可能会有问题。此外,如果文件不是通过 open
以另一种方式打开的(我不知道这是否可能只是猜测,也许是为了追加等),这是行不通的。
理想情况下,您应该在 open 内置函数中放置一个断点,但这是不可能的。相反,您可以覆盖它,并将断点放在那里:
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 程序 python -m pdb prog.py
.
如果您不知道打开的调用在哪里,您需要在尽可能早的点(例如 __main__
-guard)修补原始的 open
,如下所示:
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()