TypeError:'instancemethod'对象不可迭代(Python)

时间:2016-11-28 22:45:11

标签: python multithreading typeerror caesar-cipher

我是python和线程的新手。我正在尝试编写一个使用线程和队列的程序,以便使用caesar密码加密txt文件。当我独家使用加密功能时,加密功能可以很好地工作,但是当我在程序中使用它时会出现错误。错误从这一行开始:

for c in plaintext:

以下是整个代码:

import threading
import sys
import Queue

#argumanlarin alinmasi
if len(sys.argv)!=4:
    print("Duzgun giriniz: '<filename>.py s n l'")
    sys.exit(0)
else:
    s=int(sys.argv[1])
    n=int(sys.argv[2])
    l=int(sys.argv[3])

#Global
index = 0

#caesar sifreleme


#kuyruk deklarasyonu
q1 = Queue.Queue(n)
q2 = Queue.Queue(2000)


lock = threading.Lock()

#Threadler
threads=[]

#dosyayi okuyarak stringe cevirme
myfile=open('metin.txt','r')
data=myfile.read()


def caesar(plaintext, key):
    L2I = dict(zip("ABCDEFGHIJKLMNOPQRSTUVWXYZ", range(26)))
    I2L = dict(zip(range(26), "ABCDEFGHIJKLMNOPQRSTUVWXYZ"))

    ciphertext = ""
    for c in plaintext:
        if c.isalpha():
            ciphertext += I2L[(L2I[c] + key) % 26]
        else:
            ciphertext += c
    return ciphertext

#Thread tanimlamasi
class WorkingThread(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)

    def run(self):
        lock.acquire()
        q2.put(caesar(q1.get, s))
        lock.release()

for i in range(0,n):
    current_thread = WorkingThread()
    current_thread.start()
    threads.append(current_thread)

output_file=open("crypted"+ "_"+ str(s)+"_"+str(n)+"_"+str(l)+".txt", "w")

for i in range(0,len(data),l):
    while not q1.full:
        q1.put(data[index:index+l])
        index+=l
    while not q2.empty:
        output_file.write(q2.get)

for i in range(0,n):
    threads[i].join()

output_file.close()
myfile.close()

非常感谢任何帮助,提前谢谢。

2 个答案:

答案 0 :(得分:5)

在您的代码中,您使用的是q1.getq2.get,它们是函数对象。而是用括号称呼它:

q1.get()

将从Queue获取值。

根据Queue.get() document

  

从队列中删除并返回一个项目。如果可选的args块为true且timeout为None(默认值),则在必要时阻止,直到某个项可用为止。

答案 1 :(得分:2)

你正在传递Queue。 [函数]传递给caesar而不是调用Queue的值。 get()

添加一些'()',你应该没问题。 :)