2016-04-11 11 views
0

Ich habe ein Python-Programm, das ein anderes Modul (SqRt, in einer anderen Python-Datei, dum_waiter.py) als Thread ausgeführt wird. Der Thread/das Modul läuft, es druckt ein paar Kommentare aus, um es mir mitzuteilen. Das oberste Programm, das es aufruft, sieht jedoch keine globale Variable (Result), die es (SqRt) erstellt hat. Wenn ich beide Bits in derselben Python-Datei habe, ist alles in Ordnung.Python-Programm führt Thread in einem anderen Python-Programm, kann globale Variable nicht sehen

Ich versuche tatsächlich, ein Bild auf einem RPi als Reaktion auf einen Tastendruck zu erfassen, funktioniert alles mit dem Poling der Linie, aber es als Thread läuft nicht (Poling ist jedes Bild, also wenn Bildrate ist sehr niedrig, kann es einen Knopfdruck verpassen).

Code unten ist ein Testcode, sehr einfach. Es ruft SqRt in dumb_waiter.py auf (herumspielen, die Namen sind verrückt). Es dient nur dazu, mich auf die Sichtbarkeit der Variablen zu konzentrieren.

import time 
from threading import Thread 
from dumb_waiter import SqRt 
Result = False 

Result1 = Thread(target = SqRt, args = ("sqrt 2", 2)) 
Result1.start() 
while not Result: 
    pass 
print("test dumb_waiter, output is", Result) 

Als nächstes folgt das Programm dum_waiter.py. I füge eine zufällige Verzögerung von 1 bis 10 Sekunden, so dass ich kann leicht mehr als 1 Faden läuft visualisieren .....: -

import time 
from threading import Thread 
from random import randint # this should be in the module below, but it works 

def SqRt(VarName, MyNo): 
    global Result 
    Result = False 
    Wait = randint(1,10) 
    print("wait", Wait, "seconds") 
    time.sleep(Wait) 
    Result = [VarName, MyNo ** 0.5] 
    print("dumb_waiter result is", Result) 
    return 

Die oben die folgende Ausgabe erzeugt: -

2 Sekunden warten

dumb_waiter Ergebnis ist [ ‚sqrt 2‘, 1,4142135623730951]

eindeutig der Faden arbeitet, aber ich kann die globale Variable Ergebnis aus dem früheren Code nicht sehen, dass dumb_waiter.py ruft, und bin Ausführung daher nicht den Druck ("Test dumb_waiter, Ausgabe ist", Ergebnis) instru ction im Code der obersten Ebene. Wie ich sage, alles in eine einzige Python-Datei und alles funktioniert gut .....

Also, wie erstelle ich eine Variable, die der Thread-Code ändert, und die Top-Level-Code kann sehen, wenn die zwei Programme sind in verschiedenen Python-Dateien?

Antwort

0

In dumb_waiter.py, wenn Sie global Result schreiben, beziehen Sie sich nicht auf die Variable Result in Ihrer ersten Datei. Eine Bezugnahme auf diese Variable wäre schwierig, ohne eine zirkuläre Abhängigkeit einzuführen.

Eine Möglichkeit, dies zu tun, ist eine dritte Datei zu erstellen, shared_variable.py:

Result = False 

Dann in dumb_waiter.py:

import time 
from threading import Thread 
import shared_variable 
from random import randint # this should be in the module below, but it works 

def SqRt(VarName, MyNo): 
    shared_variable.Result = False 
    Wait = randint(1,10) 
    print("wait", Wait, "seconds") 
    time.sleep(Wait) 
    shared_variable.Result = [VarName, MyNo ** 0.5] 
    print("dumb_waiter result is", Result) 
    return 

Und in test.py:

import time 
import shared_variable 
from threading import Thread 
from dumb_waiter import SqRt 

Result1 = Thread(target = SqRt, args = ("sqrt 2", 2)) 
Result1.start() 
while not shared_variable.Result: 
    pass 
print("test dumb_waiter, output is", shared_variable.Result) 

Das ist ziemlich nah an Ihrem ursprünglichen Code, und es sollte funktionieren, aber es ist eine schlechte ID ZB weil die while Schleife beschäftigt-wartet. Eine bessere Idee wäre es, join auf dem laufenden Thread aufzurufen.

+0

Guter Punkt über das Anschließen des Threads. Im realen Programm werde ich immer noch das Ergebnis (zwischen den Frames) polieren, um zu sehen, ob die Taste gedrückt wurde. Ich habe das Problem mit einer (meiner Meinung nach) sehr uneleganten Lösung gelöst. Ich habe import dumb_waiter als d # hinzugefügt, um die Eingabe später zu minimieren. von dumb_waiter import * dann auf Ergebnis als d.Result bezogen. Sorry, kann nicht scheinen, ein cr zu bekommen, so Layout ist schlecht. – PeterPiper