2016-11-28 16 views
0

私はPythonとスレッドでかなり新しいです。私は、スレッドとキューを使用して、シーザー暗号を使って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.getq2.getを使用しています。代わりに括弧でそれを呼び出す:

Queueから値を取得します
q1.get() 

Queue.get() document 1として

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

キューを渡しています。 [関数]を呼び出してQueueからの値の代わりにcaesarにします。 get()

いくつかの '()'を追加すると、うまくいくはずです。 :)

関連する問題