如何将crunch生成的词表实时管道传输至Python脚本?
问题分析与解决
你踩了一个很常见的管道使用误区——管道传递的是标准输入流,而不是命令行参数,这就是为什么你的脚本没报错但也没写入内容的原因~
你的原脚本用sys.argv[1]读取参数,但sys.argv只能拿到脚本运行时紧跟在后面的命令行参数(比如python save.py test里的test),而管道是把crunch的输出作为脚本的输入流传递,和命令行参数完全是两回事。
正确的实现方式
我们需要修改Python脚本,从标准输入流中读取crunch的输出,这里推荐用更简洁安全的文件操作方式:
import sys # 使用with语句自动管理文件资源,避免手动close的遗漏 with open("f.txt", "a") as f: # 逐行读取标准输入(crunch默认每行输出一个词) for line in sys.stdin: # 移除每行末尾的换行符(可选,根据需求决定是否保留) word = line.rstrip('\n') # 将词写入文件,这里保留换行符让每个词单独占一行 f.write(f"{word}\n")
为什么这样能行?
sys.stdin是Python的标准输入流对象,当你用管道把crunch的输出传给脚本时,crunch的每一行输出都会成为sys.stdin的一行内容。- 逐行迭代
sys.stdin的方式,即使crunch生成超大词表,也不会占用过多内存,处理更高效。 with语句会在代码块结束后自动关闭文件,比手动调用f.close()更可靠,还能避免异常导致的文件未关闭问题。
额外小技巧
如果是小词表场景,你也可以一次性读取所有内容再写入(大词表不推荐,容易内存溢出):
import sys with open("f.txt", "a") as f: all_words = sys.stdin.read() f.write(all_words)
内容的提问来源于stack exchange,提问作者xerp152
相关产品推荐
相关产品推荐

