Python 如果我没有';我不知道错误在哪里
我有一个非常大的Python3.x程序在Windows中运行。它99.9%的时间运行良好,但偶尔会崩溃。我不确定是什么导致了这次事故,可能有很多原因。由于出于安全原因(不要问),我必须用一个不可见的控制台运行程序“compiled”.exe”,所以当它死机时,我看不到任何形式的控制台读数。所以很明显,如果我能让它以文本文件的形式输出崩溃回溯,那就太好了Python 如果我没有';我不知道错误在哪里,python,python-3.x,Python,Python 3.x,我有一个非常大的Python3.x程序在Windows中运行。它99.9%的时间运行良好,但偶尔会崩溃。我不确定是什么导致了这次事故,可能有很多原因。由于出于安全原因(不要问),我必须用一个不可见的控制台运行程序“compiled”.exe”,所以当它死机时,我看不到任何形式的控制台读数。所以很明显,如果我能让它以文本文件的形式输出崩溃回溯,那就太好了 我熟悉Python中的try/except,但导致问题的代码可能在任何地方,我不想在数千行代码的每一行都编写单独的try/except。有没有一
我熟悉Python中的try/except,但导致问题的代码可能在任何地方,我不想在数千行代码的每一行都编写单独的try/except。有没有一种方法可以让程序始终将任何程序停止错误输出为文本文件,而不管是哪行代码导致了问题,或者错误可能是什么?我最终编写了自己的日志函数
# Takes two inputs - logfile (path to desired .csv), and data to be written
# Writes "Y-M-D|H:M:S, data\n"
f = open(logfile, 'a+')
currentdate = time.strftime('%Y-%m-%d|%H:%M:%S')
f.write(currentdate + ',' + data +'\n')
f.close()
它需要时间
或日期时间
,我不确定是哪个。您还需要确保日志文件存在
然后我会在任何需要的地方把它放进去,例如:
logger(ERRLOG,“OCR没有找到poop.Check{}”。format(OCR\u outfielpath))
我最终编写了自己的日志函数
# Takes two inputs - logfile (path to desired .csv), and data to be written
# Writes "Y-M-D|H:M:S, data\n"
f = open(logfile, 'a+')
currentdate = time.strftime('%Y-%m-%d|%H:%M:%S')
f.write(currentdate + ',' + data +'\n')
f.close()
它需要时间
或日期时间
,我不确定是哪个。您还需要确保日志文件存在
然后我会把它放在任何需要的地方,例如:
logger(ERRLOG,“OCR没有找到poop.Check{}.format(OCR\u outfielpath))
在代码中的某个地方,必须有一个可能崩溃的代码入口点(至少在主脚本中)。您可以将其包装在try
/except
对中,然后在异常发生时使用回溯
模块中的函数将异常打印到文件中:
更改:
if __name__ == "__main__":
do_stuff()
致:
如果您愿意,您可以添加一些额外的代码来向文件中写入额外的输出,带有时间/日期戳或任何您认为有用的其他信息。如果要对代码的某些部分进行特别检查,您可能需要添加额外的try
/,但
块除外,或多或少类似于上面的块。例如,您可以在循环中放置一个块,如果发生异常,您可以在循环中打印出循环值:
for x in some_iterable:
try:
do_something_with(x)
except:
with open("exceptions.log", "a") as logfile:
print("Got an exception while handling {!r} in the loop:".format(x)
traceback.print_exc(file=logfile)
raise # you could omit this line to suppress the exception and keep going in the loop
如果您想为问题的文件写入端提供一个更可配置的系统,还可以使用
日志记录
模块。logging.debug
和logging.exception
函数都读取了traceback
模块使用的相同异常信息,但有更多的选项可供您自己格式化(如果需要)。请注意,设置日志记录比手动打开文件要复杂得多。在代码中的某个地方,必须有一个可能崩溃的代码入口点(至少在主脚本中)。您可以将其包装在try
/except
对中,然后在异常发生时使用回溯
模块中的函数将异常打印到文件中:
更改:
if __name__ == "__main__":
do_stuff()
致:
如果您愿意,您可以添加一些额外的代码来向文件中写入额外的输出,带有时间/日期戳或任何您认为有用的其他信息。如果要对代码的某些部分进行特别检查,您可能需要添加额外的try
/,但
块除外,或多或少类似于上面的块。例如,您可以在循环中放置一个块,如果发生异常,您可以在循环中打印出循环值:
for x in some_iterable:
try:
do_something_with(x)
except:
with open("exceptions.log", "a") as logfile:
print("Got an exception while handling {!r} in the loop:".format(x)
traceback.print_exc(file=logfile)
raise # you could omit this line to suppress the exception and keep going in the loop
如果您想为问题的文件写入端提供一个更可配置的系统,还可以使用
日志记录
模块。logging.debug
和logging.exception
函数都读取了traceback
模块使用的相同异常信息,但有更多的选项可供您自己格式化(如果需要)。请注意,设置日志记录比手动打开文件要复杂得多。我不确定这是什么类型的程序,也不确定您是如何运行它的,但您可以尝试运行Python程序并将其所有输出(或所有错误)重定向到一个文件
例如,如果我有一个非常做作的Python脚本示例,如下所示
def do_stuff():
s=[1,2,3,4,5]
印刷品(s[6])
如果名称=“\uuuuu main\uuuuuuuu”:
做某事
这会故意引发索引器
异常
您可以这样运行它:
$python test.py&>mylogs.txt
$cat mylogs.txt
回溯(最近一次呼叫最后一次):
文件“test.py”,第8行,在
做某事
文件“test.py”,第4行,在do_stuff中
印刷品(s[6])
索引器:列表索引超出范围
它将所有输出和错误重定向到一个文件
或者,如果可以将其显示在控制台上并将其重定向到文件:
$python test.py 2>&1 | tee mylogs.txt
回溯(最近一次呼叫最后一次):
文件“test.py”,第8行,在
做某事
文件“test.py”,第4行,在do_stuff中
印刷品(s[6])
索引器:列表索引超出范围
$cat mylogs.txt
回溯(最近一次呼叫最后一次):
文件“test.py”,第8行,在
做某事
文件“test.py”,第4行,在do_stuff中
印刷品(s[6])
索引器:列表索引超出范围
这样,您就不需要对代码进行任何修改
请注意,此解决方案适用于Linux或Mac系统。请参阅。我不确定这是什么类型的程序,也不确定您是如何运行它的,但您可以尝试运行Python程序并将其所有输出(或所有错误)重定向到一个文件 例如,如果我有一个非常做作的Python脚本示例,如下所示
def do_stuff():
s=[1,2,3,4,5]
印刷品(s[6])
如果名称=“\uuuuu main\uuuuuuuu”:
做某事
这会故意引发索引器错误