2016-08-16 3 views
0

Ich versuche, C# Code in python zu replizieren, die einen Thread ausführt, wartet, bis es fertig ist und einen Wert zurückgibt. Im Wesentlichen befindet sich die Methode RunAndWait in einer Hilfsklasse, da ein Aufruf dieser Methode mehrmals erfolgt.Empfangen Rückgabewert von anderen Thread in einem anderen Modul

C# Code ist wie folgt:

public static bool RunAndWait(Action _action, long _timeout) 
    { 
     Task t = Task.Run(() => 
     { 
      Log.Message(Severity.MESSAGE, "Executing " + _action.Method.Name); 
      _action(); 
     }); 
     if (!t.Wait(Convert.ToInt32(_timeout))) 
     { 
      Log.Message(Severity.ERROR, "Executing " + _action.Method.Name + " timedout. Could not execute MCS command."); 
      throw new AssertFailedException(); 
     } 
     t.Dispose(); 
     t = null; 
     return true; 
    } 

In python ich mit ein paar Dinge zu kämpfen haben. Erstens scheint es verschiedene Arten von Queues zu geben, wo ich einfach den Import ausgewählt habe, der zu funktionieren schien import Queue. Zweitens erhalte ich einen TypeError wie unten.

Traceback (most recent call last): File "C:/Users/JSC/Documents/Git/EnterprisePlatform/Enterprise/AI.App.Tool.AutomatedMachineTest/Scripts/monkey.py", line 9, in File "C:\Users\JSC\Documents\Git\EnterprisePlatform\Enterprise\AI.App.Tool.AutomatedMachineTest\Scripts\Libs\MonkeyHelper.py", line 4, in RunCmdAndWait TypeError: module is not callable

Hier ist der Code für python Affe:

from Libs.CreateConnection import CreateMcsConnection 
import Libs.MonkeyHelper as mh 
import Queue 

q = Queue.Queue() 
to = 5000 #timeout 

mh.RunCmdAndWait(CreateMcsConnection, to, q) 
serv, con = q.get() 

und MonkeyHelper.py:

import threading 

def RunCmdAndWait(CmdToRun, timeout, q): 
    t = threading(group=None, target=CmdToRun, arg=q) 
    t.start() 
    t.join(timeout=timeout) 

Ich bin nicht sicher, was ich falsch mache. Ich bin ziemlich neu bei Python. Könnte mir bitte jemand helfen?

bearbeiten

t = threading.Thread(group=None, target=CmdToRun, args=q) 

einen weiteren Fehler der Linie oben gebracht Korrektur:

Exception in thread Thread-1: Traceback (most recent call last): File "C:\Program Files (x86)\IronPython 2.7\Lib\threading.py", line 552, in _Thread__bootstrap_inner self.run() File "C:\Program Files (x86)\IronPython 2.7\Lib\threading.py", line 505, in run self.target(*self.__args, **self.__kwargs) AttributeError: Queue instance has no attribute '__len'

Ist das, weil Thread erwartet mehrere args oder weil die queue ist an dieser Stelle noch leer? Von dem, was ich gesehen habe, ist, dass die queue gerade als Argument übergeben wird, um den Rückgabewert zu erhalten. Ist das der richtige Weg?

EDIT2

Changed t = threading.Thread(group=None, target=CmdToRun, args=q)-t = threading.Thread(group=None, target=CmdToRun, args=(q,))

Die Veränderung Erträge in einem Typeerror unten, scheint mir seltsam, da Thread ist ein Tupel erwartet.

Exception in thread Thread-1: Traceback (most recent call last): File "C:\Program Files (x86)\IronPython 2.7\Lib\threading.py", line 552, in _Thread__bootstrap_inner self.run() File "C:\Program Files (x86)\IronPython 2.7\Lib\threading.py", line 505, in run self.__target(*self.__args, **self.__kwargs) TypeError: tuple is not callable

+0

Sie möchten 'threading.Thread()'. Wenn Sie den Fehler genau betrachten, wird es Sinn machen. – sberry

Antwort

1

threading ist ein Modul. Du meinst wahrscheinlich

t = threading(group=None, target=CmdToRun, arg=q) 

mit

t = threading.Thread(group=None, target=CmdToRun, args=(q,)) 

args ist ein Argumenttupel zu ersetzen.

+0

Danke, das hat das Problem behoben. Ich sehe jetzt Modul ist "Threading", während das Objekt ist "Thread". Das bringt einen neuen Fehler. Siehe Bearbeiten. –

+0

Nochmals vielen Dank für Ihre Hilfe. Ich passte die zweite Änderung an und übergab 'args = (q,) 'was zu' TypeError: tuple is not callable' führte. –

Verwandte Themen