2016-11-28 23 views
0

Я довольно новый с python и threading. Я пытаюсь написать программу, которая использует потоки и очереди для шифрования txt-файла с использованием цезарного шифрования. Функция шифрования работает сама по себе, когда я использую ее исключительно, но я получаю сообщение об ошибке, когда использую его в своей программе. Ошибка начинается с этой строки:TypeError: объект instancemethod не является итерируемым (Python)

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() 

бы признателен за любую помощь, заранее спасибо.

+0

Это не имеет никакого отношения к многопоточности, это простая синтаксическая ошибка. Я думаю, 'q2.put (caesar (q1.get, s))' должен быть 'q2.put (caesar (q1.get(), s))'? – UnholySheep

ответ

4

В вашем коде вы используете q1.get и q2.get, которые являются объектами функции. Вместо называть ее скобкой:

q1.get() 

, который будет получать значение из Queue.

Согласно Queue.get() document:

Remove and return an item from the queue. If optional args block is true and timeout is None (the default), block if necessary until an item is available.

+0

Я только что заказал вам пахлаву. Большое спасибо ... –

+0

Несмотря на то, что я решил эту проблему благодаря вам, моя программа все еще не записывает в выходной файл, который мне нужен (файл, который должен содержать зашифрованный текст файла txt: metin.txt, как указано в программа). Это проблема, отличная от той, которую я просил, но я был бы признателен, если бы вы могли помочь в этом, спасибо –

+0

Спасибо и хорошо спать! :) –

1

Вы прохождения очереди. введите [функция] в цезарь вместо значения из очереди вызовов. get().

Добавьте несколько «()», и все должно быть в порядке. :)

Смежные вопросы