mzorroax: Variable aus Javascript in Pythonscript verwenden

Hallo,

Gibt es eine Möglichkeit eine in Javascript definierte Variable (in meinem Fall "chosenserver") in einem Pythonprogramm zu verwenden?

#! /usr/bin/env python

-*- coding: utf-8 -*-

import...
print 'Content-Type: text/html\n\n'
print'''
<html>
<head>
<script type="text/javascript">
        function sendservergroup(value)
        {
         var chosenserver = document.auswahl.Group.value;
         alert(chosenserver);
        }
</script>
.
.
.
</html>'''

///hier würde ich nun gerne die Variable "chosenserver" benutzen:

for i in range (0, 5):
        xmldoc = minidom.parse('../xxxxxx.xml')
        servicedescription = xmldoc.getElementsByTagName('service')
        bitref = servicedescription [chosenserver[x]]
        a = bitref.attributes["description"]
        x = x + 1
        servicelist.append(a.value)

Vielen Dank schonmal im Vorraus!
Gruß mzorroax

  1. Tach!

    Gibt es eine Möglichkeit eine in Javascript definierte Variable (in meinem Fall "chosenserver") in einem Pythonprogramm zu verwenden?

    Nein. Üblicherweise kann man keine Variablen des einen Systems in einem anderen System verwenden. Üblicherweise kann man jedoch den Wert in der Variable aus einem System in ein anderes System geben.

    Du hast aber auch noch ein zeitliches Problem. Dein JavaScript läuft im Browser, wenn dein Python im Server bereits längst seine Arbeit abgeschlossen hat. Wenn du also im Server etwas mit dem Wert aus Javascript etwas anstellen willst, musst du einen neuen Request an den Server stellen.

    dedlfix.

    1. Nein. Üblicherweise kann man keine Variablen des einen Systems in einem anderen System verwenden. Üblicherweise kann man jedoch den Wert in der Variable aus einem System in ein anderes System geben.

      Und wir würde das gehen?

      Du hast aber auch noch ein zeitliches Problem. Dein JavaScript läuft im Browser, wenn dein Python im Server bereits längst seine Arbeit abgeschlossen hat. Wenn du also im Server etwas mit dem Wert aus Javascript etwas anstellen willst, musst du einen neuen Request an den Server stellen.

      Das zeitliche problem lässt sich doch relative einfach dadurch lösen, dass ich die Schleife erst aufrufen lasse, sobald die Javascriptfunktion aufgerufen wurder oder?

      1. Tach!

        Üblicherweise kann man keine Variablen des einen Systems in einem anderen System verwenden. Üblicherweise kann man jedoch den Wert in der Variable aus einem System in ein anderes System geben.
        Und wir würde das gehen?

        Das war eine sehr allgemeine Aussage. Wie das konkret geht, kommt auf die jeweiligen Systeme und deren Möglichkeiten an. Generell ist es jedoch der Wert und nicht die Variable an sich, der übergeben werden muss. Das hört sich vielleicht nach Krümelkacken an, ist aber für das Verständnis wichtig. Du bekommst, um es mal mit deinen Worten zu sagen, nur dann "eine Variable anderenorts verwendet", wenn du deren Inhalt ausgibst (echo/print/o.ä.), ihn überträgst und am Ziel in eine dortige Variable bringst.

        Du hast aber auch noch ein zeitliches Problem. Dein JavaScript läuft im Browser, wenn dein Python im Server bereits längst seine Arbeit abgeschlossen hat. Wenn du also im Server etwas mit dem Wert aus Javascript etwas anstellen willst, musst du einen neuen Request an den Server stellen.
        Das zeitliche problem lässt sich doch relative einfach dadurch lösen, dass ich die Schleife erst aufrufen lasse, sobald die Javascriptfunktion aufgerufen wurder oder?

        Nein, das bekommst du nicht hin, weil zuerst das Python-Script abgearbeitet wird und dann erst der Browser und Javascript zum Zuge kommt. Selbst wenn du in Betracht ziehst, dass die bereits fertiggestellten Teile der Ausgabe schon zum Client gesendet werden können - was jedoch oftmals nicht direkt geschieht sondern vom Webserver gepuffert wird, bis genügend Daten für ein Paket zusammengekommen sind - und der Client schon mit der Verarbeitung (Rendern) anfagen kann, nützt dir das nichts, weil die Übertragung eine Einbahnstraße ist. Der Request geht in die vom Client zum Server, wenn der fertg übertragen ist, wird er abgearbeitet und die Response geht wieder zurück. Mehr Datenverkehr ist nicht vorgesehen. Neue daten vom Client zum Server brauchen einen neuen Request - und zu diesem startet der Webserver üblicherweise eine komplett gekapselte und neue Abarbeitung.

        Für bidirektionale Kommunikation kannst du WebSocket nehmen, aber das erfordert ein anderes Vorgehen, ist vermutlich mehr als du brauchst und helfen kann ich dir dabei mangels Erfahrung auch nicht.

        dedlfix.

        1. Das zeitliche Problem habe ich jetzt mit einem Frameset gelöst, wobei der Inhalt des 2. Frames durch einen "Submit-Button" aufgerufen wird!

          [...] wenn du deren Inhalt ausgibst (echo/print/o.ä.), ihn überträgst und am Ziel in eine dortige Variable bringst.

          Bei der Übergabe der WERTE habe ich gerade mithilfe von method="post" erste Erfolge zu verzeichnen: die werte werden übergeben! *yuhuuu*

          Da es mehrere Werte sind, sind diese durch "&" getrennt, wnen ich mir alle ausgeben lasse. Wie kann ich dnen nun auf einen davon zugreifen? da steht dann zum Beispiel: ...&alternativeend=&Group=gruppe1&...

          Wie kann ich jetzt auf den Wert von Group (Gruppe1) zugreifen, bzw diesen weiterverwenden?

          Ps: Vielen Dank nochmal ihr habt mir bis hierher schon sehr viel weiter geholfen!!!

          1. Tach!

            Bei der Übergabe der WERTE habe ich gerade mithilfe von method="post" erste Erfolge zu verzeichnen: die werte werden übergeben! *yuhuuu*
            Da es mehrere Werte sind, sind diese durch "&" getrennt, wnen ich mir alle ausgeben lasse. Wie kann ich dnen nun auf einen davon zugreifen? da steht dann zum Beispiel: ...&alternativeend=&Group=gruppe1&...

            Du könntest mit Stringverarbeitung die Werte auseinandernehmen. Das ist aber aufwendig und nicht nötig, denn es gibt da was Eingebautes in Python: urllib oder urllib2. Welche davon state of the art ost, weiß ich nicht, vermutlich aber urllib2.

            dedlfix.

            1. Du könntest mit Stringverarbeitung die Werte auseinandernehmen. Das ist aber aufwendig und nicht nötig, denn es gibt da was Eingebautes in Python: urllib oder urllib2. Welche davon state of the art ost, weiß ich nicht, vermutlich aber urllib2.

              dedlfix.

              Das hat super geklappt! Vielen Dank! Allerdings habe ich nun auch schon eine neues (hoffentlich letztes) Problem:

              rechner1 = [1,2,5]
              rechner2 = [3,5,8]

              group = rechner1

              später wird in einer For-Schleife [rechner[x]] aufgerufen, jedoch würde ich gerne hier je nach ausgewählter Gruppe das passende aufrufen!

              Also quasi : [group[x]] wobei eben manchmal statt group, rechner1 da steht oder rechner2, um dann die Zahlen abrufen zu können.

              Ist das möglich? Wenn ja wie?

              mzorroax

              1. Tach!

                rechner1 = [1,2,5]
                rechner2 = [3,5,8]

                group = rechner1

                später wird in einer For-Schleife [rechner[x]] aufgerufen, jedoch würde ich gerne hier je nach ausgewählter Gruppe das passende aufrufen!

                Bitte beschreib das Problem nachvollziehbar. Meinst du statt [x] die Ziffern 1 oder 2, also die Variablennamen rechner1 und rechner2 oder meinst du wirklich einen Array-Zugriff? Wenn letzteres, wo kommt jetzt rechner her?

                Also quasi : [group[x]] wobei eben manchmal statt group, rechner1 da steht oder rechner2, um dann die Zahlen abrufen zu können.

                Möchtest du das, was unter PHP "variable Variablen" heißt, also dass der Name der Variablen, auf die du zugreifen willst, in einer anderen Variablen steckt, statt direkt im Code notiert zu sein? Dann lautet das Stichwort globals()/locals(). Das sind Dictionarys aller aktuellen Variablen des jeweiligen Scopes.

                dedlfix.

                1. Bitte beschreib das Problem nachvollziehbar. Meinst du statt [x] die Ziffern 1 oder 2, also die Variablennamen rechner1 und rechner2 oder meinst du wirklich einen Array-Zugriff? Wenn letzteres, wo kommt jetzt rechner her?

                  Sry Tippfehler! ich meinte natürlich:

                  später wird in einer For-Schleife [rechner1[x]] oder eben [rechner2[x]] aufgerufen!

                  1. Tach!

                    später wird in einer For-Schleife [rechner1[x]] oder eben [rechner2[x]] aufgerufen!

                    Es ist ungünstig, wenn der Variablenname, auf den zugegriffen werden soll, sich erst zur Laufzeit ergibt. Dann braucht es einen Mechanismus, der den einen String zu einem Variablennamen auflöst. In kompilierenden Sprachen muss man dazu in der Regel das Geschütz Reflection auffahren. Dynamische Sprachen bringen oftmals eine einfachere Möglichkeit mit. Python speichert sowieso alle Variablen in einer globalen und einer lokalen Struktur, über die du per Namen zugreifen kannst. Aber das hab ich ja schon in meiner vorigen Antwort erwähnt.

                    Untersuch mal, ob du nicht gleich mit einer List oder einem Dictionary besser kommst als mit einzeln benannten Variablen.

                    dedlfix.

                    1. Untersuch mal, ob du nicht gleich mit einer List oder einem Dictionary besser kommst als mit einzeln benannten Variablen.

                      dedlfix.

                      Nochmals viele Dank dedlfix!!

                      Mit einem Dictionary klappts nicht:

                      buch = {"rechner1" : "[1,2,5]", "rechner2" : "[3,5,8]"}

                      test = buch["rechner1"]

                      in der for schleife: [test[x]]

                      Fehlermeldung: list indices must be integers

                      Wie hast du gedacht das das mit globals locals funktioniert? Habe leider spontan keine Idee wo ich da ansetzen sollte...

                      mzorroax

                      1. Tach!

                        Untersuch mal, ob du nicht gleich mit einer List oder einem Dictionary besser kommst als mit einzeln benannten Variablen.
                        Mit einem Dictionary klappts nicht:
                        buch = {"rechner1" : "[1,2,5]", "rechner2" : "[3,5,8]"}

                        Ich dachte eher an rechner = {1: ..., 2: ...}, weil ich annahm, das das eine Aufzählung sei. Wenn rechner1 und rechner2 jedoch Namen sind, die Zahlen also dazugehören, dann lass das so. Aber warum hast du da als Werte Strings ("[1,2,5]") notiert? Ich dachte, das sollen Listen sein?

                        test = buch["rechner1"]

                        Damit hast du jetzt einen String in Test stehen. Der besteht aus den Zeichen [ und 1 und , und 2 und so weiter.

                        in der for schleife: [test[x]]
                        Fehlermeldung: list indices must be integers

                        Ich kann mir jetzt nur zusammenreimen, dass du diese Zeichen als List-Indices verwenden willst, was ja aber keine Integers sind. Also musst du oben tatsächlich Listen statt Strings notieren.

                        Wie hast du gedacht das das mit globals locals funktioniert? Habe leider spontan keine Idee wo ich da ansetzen sollte...

                        Wenn du eine Variable foo (zum Beispiel durch eine Zuweisung) erzeugst (foo = 42), dann kannst du über ihren Namen foo ganz normal im Code zugreifen. Außerdem existiert nun ein Eintrag in einem lokalen oder globalen Dictionary, welches dir von der Funktion locals() oder globals() zurückgegeben wird. Über locals()['foo'] kannst du nun ebenfalls lesend auf den Wert in foo zugreifen, wobei du auch

                        bar = 'foo'
                          print(locals()[bar])

                        machen könntest, dann wird der Name foo nicht direkt als String übergeben, sondern befindet sich in bar. Es kann jetzt noch sein, dass du globals() statt locals() nehmen musst, das hängt von deinen Gegebenheiten ab. Vergleiche: http://www.diveintopython.net/html_processing/locals_and_globals.html

                        dedlfix.

                        1. Wenn du eine Variable foo (zum Beispiel durch eine Zuweisung) erzeugst (foo = 42), dann kannst du über ihren Namen foo ganz normal im Code zugreifen. Außerdem existiert nun ein Eintrag in einem lokalen oder globalen Dictionary, welches dir von der Funktion locals() oder globals() zurückgegeben wird. Über locals()['foo'] kannst du nun ebenfalls lesend auf den Wert in foo zugreifen, wobei du auch

                          bar = 'foo'
                            print(locals()[bar])

                          machen könntest, dann wird der Name foo nicht direkt als String übergeben, sondern befindet sich in bar. Es kann jetzt noch sein, dass du globals() statt locals() nehmen musst, das hängt von deinen Gegebenheiten ab. Vergleiche: http://www.diveintopython.net/html_processing/locals_and_globals.html

                          dedlfix.

                          1000 Dank für diese extrem schnelle und Perfekte Lösung! Funktioniert Einwandfrei!

      2. Moin,

        Und wir würde das gehen?

        Beispielsweise mit Ajax

        Du hast aber auch noch ein zeitliches Problem. Dein JavaScript läuft im Browser, wenn dein Python im Server bereits längst seine Arbeit abgeschlossen hat. Wenn du also im Server etwas mit dem Wert aus Javascript etwas anstellen willst, musst du einen neuen Request an den Server stellen.

        Das zeitliche problem lässt sich doch relative einfach dadurch lösen, dass ich die Schleife erst aufrufen lasse, sobald die Javascriptfunktion aufgerufen wurder oder?

        Nein. Das Pythonskript ist bereits beendet, wenn Javascript ausgeführt wird. Ein neuer Request kann aber ein weiteres Skript starten.

        Grüße Marco