2016-08-16 3 views
0

Я пытаюсь реплицировать код C# в python, который выполняет поток, ждет его завершения и возвращает значение. По существу метод RunAndWait находится в вспомогательном классе, потому что вызов этого метода выполняется несколько раз.Получить возвращаемое значение из другой темы в другом модуле

C# код выглядит следующим образом:

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; 
    } 

В python я боролся с несколькими вещами. Во-первых, похоже, существуют разные типы Queue, где я просто выбрал импорт, который, казалось, работал import Queue. Во-вторых, я получаю TypeError, как показано ниже.

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

Вот python код обезьяны:

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

и MonkeyHelper.py:

import threading 

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

Я не уверен, что я делаю неправильно. Я довольно новичок в python. Может кто-нибудь, пожалуйста, помогите мне?

Редактировать

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

корректирующая выше линии принес еще одну ошибку:

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'

Это потому, что Thread ожидает несколько арг или потому, что queue все еще пусто в этот момент? Из того, что я видел, является то, что queue просто передается в качестве аргумента для получения возвращаемого значения. Это правильный путь?

Edit2

Изменено t = threading.Thread(group=None, target=CmdToRun, args=q) к t = threading.Thread(group=None, target=CmdToRun, args=(q,))

Выходы изменения в TypeError ниже, кажется странным для меня, так Thread ожидает кортеж.

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

Вы хотите 'threading.Thread()'. Если вы посмотрите на ошибку, это будет иметь смысл. – sberry

ответ

1

threading - это модуль. Скорее всего, вы имели в виду заменить

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

с

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

args является аргументом кортеж.

+0

Спасибо, что исправил проблему. Теперь я вижу, что модуль является 'threading', а объект -' Thread'. Что вызывает новую ошибку. См. Править. –

+0

Еще раз спасибо за помощь. Я адаптировал второе изменение, передавая 'args = (q,)', что приводит к 'TypeError: tuple не вызываемый'. –