mehrfache Abfrage eines anderen Programms

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Champ8888
User
Beiträge: 30
Registriert: Mittwoch 11. Oktober 2017, 15:53

Habe ein Problem
Ich möchte ein programm in ein anderes importieren aber das 2. programm wird nur 1 mal abgefragt

1. Programm:

import random
import Unit1

while True:
question_and_answers = [(Unit1.d, Unit1.e)]
question, answer = random.choice(question_and_answers)
b = random.randint(1,2)

if b == 1:
print("")
print(question)
c = input("")
if c == answer:
print("richtig")
else:
print("falsch, richtig wäre:")
print(answer)

if b == 2:
print("")
print(answer)
c = input("")
if c == question:
print("richtig")
else:
print("falsch, richtig wäre:")
print(question)


2.Programm:

import random

zufall = random.randint(1,76)

if zufall == 1:
e = "hallo"
d = "tschüss"

if zufall == 2:
e = "hier"
d = "weg"


Ich möchte dass zufall jedes mal anders ist. Aber im moment wird nur 1 mal am Anfang die Zufallszahl gezogen
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte benutze die Code-Tags hier im Forum um deinen Code zu formatieren. Der ist sonst wenigstens schwer verstaendlich, meistens aber sogar falsch, weil die Einruekungstiefe bei Python wichtig ist.

Und zu deinem Problem: importieren ist nicht dazu gedacht, Code auszufuehren. Du musst deine gewuenschte Funktionalitaet in eine Funktion stecken (darum heisst die so), und die dann vom anderen Modul aufrufen. So, wie du das auch mit den Funktionen aus dem random-Modul machst.
Champ8888
User
Beiträge: 30
Registriert: Mittwoch 11. Oktober 2017, 15:53

Vielen dank für deine Hilfe
Auch das mit dem Code-Tags
Champ8888
User
Beiträge: 30
Registriert: Mittwoch 11. Oktober 2017, 15:53

Hbe es jetzt noch mal mit einer deffinition probiert, aber es geht irgendwie nicht, er sagt das e bzw d nich deffiniert ist
1. Programm

import random
from Unit1 import *

while True:
Abfrage()
question_and_answers = [(e, d)]
question, answer = random.choice(question_and_answers)
b = random.randint(1,2)

if b == 1:
print("")
print(question)
c = input("")
if c == answer:
print("richtig")
else:
print("falsch, richtig wäre:")
print(answer)

if b == 2:
print("")
print(answer)
c = input("")
if c == question:
print("richtig")
else:
print("falsch, richtig wäre:")
print(question)

2.Programm

import random

def Abfrage():
zufall = random.randint(1,76)

if zufall == 1:
e = "hallo"
d = "tschüss"

if zufall == 2:
e = "hier"
d = "weg"
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Uuuuuuuuuund wieder: Codebox benutzen. Schaust du dir gar nicht an, wie deine eigenen Postings aussehen? Man kann da auch auf Vorschau druecken, und auch nachtraeglich bearbeiten, falls man das vergessen hat.

So jedenfalls kann ich nichts erkennen, und dementsprechend auch nichts dazu sagen :K
Champ8888
User
Beiträge: 30
Registriert: Mittwoch 11. Oktober 2017, 15:53

Eigendlich habe ich die auch benutzt, es sieht auch richtig aus.
Aber in der Vorschau sieht es dann wieder anders aus :K
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Naja also fuer mich funktioniert das, du wirst etwas rumprobieren muessen, bis es klappt

Code: Alles auswählen

import threading
import struct
import json

import numpy as np
import nanomsg
from Foundation import NSAutoreleasePool

from .cv import MAT_INFO


def create_mat(data):
    rows, cols, type_ = struct.unpack("<III", data[:12])
    mi = MAT_INFO[type_]
    a = np.frombuffer(data[12:], dtype=mi.type)
    res = a.reshape((rows, cols, -1))
    if res.shape[-1] == 1:
        res = res.reshape(res.shape[:2])
    return res


def create_json(data):
    return json.loads(data)


CONVERTERS = {
    "cv::Mat": create_mat,
    "json": create_json,
}


class Connector():

    def __init__(self, main_thread_callback, uri, bind=True):
        self._socket = nanomsg.Socket(nanomsg.PAIR)
        if bind:
            self._socket.bind(uri)
        else:
            self._socket.connect(uri)

        self._main_thread_callback = main_thread_callback
        self._running = True
        self._t = threading.Thread(target=self._run)
        self._t.daemon = True
        self._t.start()


    def _run(self):
        pool = NSAutoreleasePool.alloc().init()
        counter = 0
        while self._running:
            msg = self._socket.recv()
            header_len = struct.unpack("<I", msg[:4])[0]
            header = json.loads(msg[4:4+header_len])
            data_len = struct.unpack("<I", msg[4 + header_len:8 + header_len])[0]
            data = msg[8 + header_len:8 + header_len + data_len]
            res = CONVERTERS[header["type"]](data)
            self._main_thread_callback((header, res))

            counter += 1
            if counter == 1000:
                del pool
                pool = NSAutoreleasePool.alloc().init()
                counter = 0


    def stop(self):
        self._running = False
        self._t.join()


    def toggle_transmitting(self):
        self._socket.send(json.dumps({ "command": "toggle-transmitting" }))


    def get_config(self):
        self._socket.send(json.dumps({ "command": "get-config" }))


    def set_override(self, command, parameter=None):
        d = dict(command=command, parameter=parameter)
        self._socket.send(json.dumps(d))
Champ8888
User
Beiträge: 30
Registriert: Mittwoch 11. Oktober 2017, 15:53

Ok hat geklappt

Code: Alles auswählen

1. Programm

import random
from Unit1 import *

while True:
Abfrage()
question_and_answers = [(e, d)]
question, answer = random.choice(question_and_answers)
b = random.randint(1,2)

if b == 1:
print("")
print(question)
c = input("")
if c == answer:
print("richtig")
else:
print("falsch, richtig wäre:")
print(answer)

if b == 2:
print("")
print(answer)
c = input("")
if c == question:
print("richtig")
else:
print("falsch, richtig wäre:")
print(question)

2.Programm

import random

def Abfrage():
zufall = random.randint(1,76)

if zufall == 1:
e = "hallo"
d = "tschüss"

if zufall == 2:
e = "hier"
d = "weg"
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Hmjaaaneee. Da sind ja trotzdem alle Einrueckungen kaputt. Hast du den Code einfach von der Webseite kopiert? Und du solltest deinen Editor auch so einstellen, das er Spaces statt Tabs produziert.
Champ8888
User
Beiträge: 30
Registriert: Mittwoch 11. Oktober 2017, 15:53

Code: Alles auswählen

1. Programm

import random
from Unit1 import *

while True:
    Abfrage()
    question_and_answers = [(e, d)]
    question, answer = random.choice(question_and_answers)
    b = random.randint(1,2)

    if b == 1: 
        print("")
        print(question)
        c = input("")
    if c == answer:
        print("richtig")
    else:
        print("falsch, richtig wäre:")
        print(answer)

    if b == 2:
        print("")
        print(answer)
        c = input("")
    if c == question:
        print("richtig")
    else:
        print("falsch, richtig wäre:")
        print(question)

2.Programm

import random

def Abfrage():
    zufall = random.randint(1,76)

    if zufall == 1:
        e = "hallo"
        d = "tschüss"

    if zufall == 2:
        e = "hier"
        d = "weg"
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ein paar Anmerkungen:

- keine Sternchenimporte. Dadurch muellst du dir den Namensraum voll, und weisst nicht mehr, woher etwas kommt.
- bitte befolge PEP8 zur Namenskonvention von Bezeichnern in Python. "Abfrage" ist ein Name bei dem jeder erfahrene Python-Entwickler annimmt, dass es sich dabei um eine Klasse handelt. Nicht eine Funktion.
- Sinn und Zweck einer Funktion ist die Kapselung von einer bestimmten Funtionalitaet. Eingaben erreichen sie ueber Parameter, Ausgaben taetigt sie durch Rueckgabewerte. Namen, die sie innerhalb des Funktionskoerpers anlegt, erscheinen (mit gutem Grund!) nicht einfach magisch in anderen Programmteilen. Lass deine Funktion also die Werte zurueckgeben, die sie bestimmt hat.

Code: Alles auswählen

def tuwas():
      a = ...
      b = ...
      return a, b


def machwas():
     c, d = tuwas()

- auch wenn ich das gerade selbst gemacht habe um nahe an deinem Beispiel zu bleiben: einbuchstabige Variablennamen sind ausser in sehr seltenen Ausnahmen eine schlechte Idee. Code wird mehr gelesen als geschrieben, Klarheit ist darum das oberste Gebot.
Champ8888
User
Beiträge: 30
Registriert: Mittwoch 11. Oktober 2017, 15:53

Wenn ich das richtig verstanden habe soll das so funktionieren oder?

Code: Alles auswählen

def Abfrage():
    zufall = random.randint(1,2)
 
    if zufall == 1:
        e = "hallo"
        d = "tschüss"
 
    if zufall == 2:
        e = "hier"
        d = "weg"

    return e, d
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Statt zu fragen ob etwas geht, ausprobieren ob's tut. Geht schneller fuer alle Beteiligten.
Champ8888
User
Beiträge: 30
Registriert: Mittwoch 11. Oktober 2017, 15:53

Hab ich aber es kommt folgende fehlermeldung

UnboundLocalError: local variable 'e' referenced before assignment
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dann haettest du das doch auch gleich schreiben koennen, oder? Auch das spart anderer Leute Zeit bei der Betrachtung deines Codes, und verschafft dir dadurch bessere (oder ueberhaupt) Antworten.

Und anhand des gezeigten Codes (immer noch schlechte Variablennamen, immer noch schlechter Funktionsname) sowie der Definition von randint kann ich mir das nicht vorstellen. Der Fehler kommt doch garantiert aus deinem Hauptprogramm. Um das zu beurteilen braucht man den *gesamten* Stacktrace des Fehlers, nicht nur das bisschen das du gezeigt hast.
Champ8888
User
Beiträge: 30
Registriert: Mittwoch 11. Oktober 2017, 15:53

Die komplette Meldung:

Traceback (most recent call last):
File "C:\Users\User\Desktop\Python\Englisch.py", line 7, in <module>
Abfrage()
File "C:\Users\User\Desktop\Python\Unit1.py", line 289, in Abfrage
return e, d
UnboundLocalError: local variable 'e' referenced before assignment

Und das Hauptprogramm:

Code: Alles auswählen

import random
from Unit1 import *

while True:
    Abfrage()
    question_and_answers = [(e, d)]
    question, answer = random.choice(question_and_answers)
    b = random.randint(1,2)
    
    if b == 1:
          print("")
          print(question)
          c = input("")            
          if c == answer:
              print("richtig")
          else:
             print("falsch, richtig wäre:")
             print(answer)

    if b == 2:
        print("")
        print(answer)
        c = input("")            
        if c == question:
            print("richtig")
        else:
            print("falsch, richtig wäre:")
            print(question)

__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Glaube ich nicht. Fuer mich funktioniert deine "Abfrage". Du hast sie aber in dein Hautprogramm falsch eingebaut, denn da benutzt du die Rueckgabewerte nicht, obwohl ich dir das ja beispielhaft gezeigt habe. Und *dort* wird auch eine Fehlermeldung zu unbound variablen kommen.

Vielleicht hast du Unit1.py (auch schlecht benannt) nicht gespeichert oder so, aber der Code, den du hier gepostet hast, der funktioniert fuer mich. Das Problem liegt also irgendwo bei dir.

Da dein Modul Unit1 eh voellig trivial ist, wuerde ich vorschlagen du packst die Funktion gleich in dein Hauptprogramm (Als Funktion! Nicht einfach den Code reinroedeln!), das macht dir das Leben etwas leichter.
Champ8888
User
Beiträge: 30
Registriert: Mittwoch 11. Oktober 2017, 15:53

Ok danke für die Hilfe
Antworten