对脚本的第二次修改(下面做出的更改)
进行了评论中提到的更改(将所有内容重命名为print_all,并添加了例外情况,更改了以下代码以反映相同内容)
然而,执行仍然没有任何理由退出
初始查询:
以下是尝试识别单词的各种字谜的脚本(如网站中所示:http://wordsmith.org/anagram/anagram.cgi?anagram=suchindra&t=1000&a=n):
import sys
import itertools
import threading
from collections import defaultdict
words_dict = defaultdict(lambda: "")
def lower_and_nocrlf(s):
return s.lower().strip()
def two_or_more(s):
if len(s) >= 1:
return 1
else:
return 0
def get_perms(cur_iter):
lst = []
for i in range(0, 10000):
try:
lst.append("".join(cur_iter.next()))
except:
break
return lst
def get_twordlist(z):
lst1 = []
lst2 = []
for i in range (1, len(z)):
lst1.append(z[:i])
lst2.append(z[i:])
return lst1, lst2
def filter_dict(x):
if x in words_dict.keys():
return x
else:
return 0
def main():
print_all = None
word = None
try:
word = sys.argv[1]
print_all = sys.argv[2]
except:
pass
if word == None:
try:
word = sys.stdin.readline()
print_all = sys.stdin.readline()
except:
pass
if word == None:
sys.exit(1)
fd = open('/usr/apps/words', 'r')
words = fd.readlines()
fd.close()
words_lower = map(lower_and_nocrlf, words)
words_lower = filter(two_or_more, words_lower)
from collections import defaultdict
for i in words_lower:
words_dict[i] = ""
iter = itertools.permutations(word)
all_permutations = []
iters = []
for i in range(0, 100):
iters.append(iter)
result = map(get_perms, iters)
main_list = []
for l in result:
if l != []:
for word in l:
main_list.append(word)
results = []
try:
main_list_len = len(main_list)
for index in range(0, main_list_len):
percent = (index/len(main_list)) * 100
lst1, lst2 = get_twordlist(main_list[index])
result1 = map(filter_dict, lst1)
result2 = map(filter_dict, lst2)
for index in range(0, len(result1)):
if (result1[index] != 0) and (result2[index] != 0):
results.append("%s %s" % (result1[index], result2[index]))
except KeyboardInterrupt:
print("User stopped execution, partial results:")
print results
sys.exit(1)
except Exception:
# catches all other types of exception here
print(sys.exc_info())
traceback.print_exc()
print(results)
if __name__ == "__main__":
try:
main()
except:
sys.exit(0)
答案 0 :(得分:1)
因此,您的代码显然正在执行print index
行,然后在块内某处失败。异常处理程序仅捕获类型KeyboardInterrupt
的异常 - 即当用户在其键盘上按下Ctl + C时。任何其他错误都将通过sys.exit(0)方法退出,因此您无法知道错误是什么。
就我个人而言,我非常喜欢这些打印输出错误的traceback
模块,因此我建议您修改try catch块,如下所示:
import traceback
try:
main_list_len = len(main_list)
print main_list_len
for index in range(0, main_list_len):
print index
percent = (index/len(main_list)) * 100
lst1, lst2 = get_twordlist(main_list[index])
result = map(filter_dict, lst1, lst2)
results.append[result]
except KeyboardInterrupt:
print("User stopped execution, partial results:")
print("Exception: %s" % (sys.exc_info()))
print results
except Exception:
# catches all other types of exception here
traceback.print_exc()
这将允许您调试问题,因为回溯模块将为您提供行号和错误消息以供使用。
祝你好运!答案 1 :(得分:0)
确定经过一些分析后,看起来过滤器不接受多个列表。第二个问题是因为我在过滤器中使用了多个列表