Mit Python in Speicher schreiben?

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.
Benutzeravatar
dieter1a
User
Beiträge: 75
Registriert: Montag 26. Februar 2007, 13:08
Wohnort: Bad Rothenfelde
Kontaktdaten:

Beitragvon dieter1a » Donnerstag 6. September 2007, 17:35

dieter1a hat geschrieben:Ich bräuchte erstmal keinen Browseraufruf, sondern einfach die Anfrage an einen URL, sprich xyz.php und natürlich die Rückgabe.
Geht sowas?
Gibts dafür Beispiele oder Tutorials?

Wäre ja auch eine Lösung des Zwischenspeicherns von Vectordaten ohne Inanspruchname von Game Engine belastenden Methoden.


Habe mich hier wohl nicht deutlich genug ausgedrückt. Sorry :oops:
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Donnerstag 6. September 2007, 22:10

Stellen wir mal das Grunddesign fest (damit es auch für nicht-Blender-User wie mich klar ist).

  • Du hast eine Blender-Anwendung die Daten zwischenspeichern muss.
  • Du kannst aus Blender heraus Python nutzen.
  • Du möchtest nicht in Textdateien zwischenspeichern, weil das zu langsam ist und zu viel Disk-IO hervorruft.
  • Also kannst du einen anderen Python-Prozess starten, der die Daten bereit hält und der per XML-RPC die Daten an den Python-Prozess aus Blender zurückgibt


Wenn ich irgendwelche Punkte falsch verstanden habe oder ausgelassen habe, dann bitte ergänzen.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
dieter1a
User
Beiträge: 75
Registriert: Montag 26. Februar 2007, 13:08
Wohnort: Bad Rothenfelde
Kontaktdaten:

Beitragvon dieter1a » Donnerstag 6. September 2007, 22:29

Leonidas hat geschrieben:
  • Du hast eine Blender-Anwendung die Daten zwischenspeichern muss.

Richtig.
Leonidas hat geschrieben:
  • Du kannst aus Blender heraus Python nutzen.

Richtig.
Leonidas hat geschrieben:
  • Du möchtest nicht in Textdateien zwischenspeichern, weil das zu langsam ist und zu viel Disk-IO hervorruft.

Richtig.
Leonidas hat geschrieben:
  • Also kannst du einen anderen Python-Prozess starten, der die Daten bereit hält und der per XML-RPC die Daten an den Python-Prozess aus Blender zurückgibt

Genau das weiß ich nicht.
Python ist die Script-Sprache in Blender, mit der sich das gesamte Verhalten der Echtzeit-Animation steuern lässt.
Wie ich nun einen URL anspreche und Daten zurück bekomme weiß ich nicht.
Darum habe ich auch den Weg über ein Director-Movie gewählt, welches in der Lage ist einen Server im Netz über einen URL anzusprechen, Rückgabewerte in eine .txt zu schreiben und die Animation ist in der Lage diese .txt zu lesen und sie zu beschreiben.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Donnerstag 6. September 2007, 22:34

dieter1a hat geschrieben:Wie ich nun einen URL anspreche und Daten zurück bekomme weiß ich nicht.

Na also! Wenn das alles ist:

Code: Alles auswählen

import urllib
remote_file = urllib.urlopen('http://dein.server.vielleicht.mit.sinnloser.berlin/tld/und.deiner.datei.txt')
remote_file_contents = remote_file.read()
remote_file.close()

Lässt sich mit Python 2.5 noch möglicherweise etwas eleganter mit dem ``with``-Statement machen.

(Was das ``with``-Statement angeht muss ich ehrlich sagen, dass es zwar einiges bietet, aber nicht wirklich elegant ausschaut).
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
dieter1a
User
Beiträge: 75
Registriert: Montag 26. Februar 2007, 13:08
Wohnort: Bad Rothenfelde
Kontaktdaten:

Beitragvon dieter1a » Donnerstag 6. September 2007, 22:44

Ich bin erstaunt, platt und sehr dankbar Leonidas.

Werde mich gleich morgen damit auseinander setzen und testen was dabei heraus kommt.
Wenn`s Fragen gibt, darf ich mich doch wieder hier melden? :D

Vielen Dank

dieter1a
abgdf

Beitragvon abgdf » Donnerstag 6. September 2007, 23:33

@Leonidas: Danke für den Code-Hinweis. Werde ich bald auf der Seite entsprechend ändern.

Viele Grüße
Benutzeravatar
dieter1a
User
Beiträge: 75
Registriert: Montag 26. Februar 2007, 13:08
Wohnort: Bad Rothenfelde
Kontaktdaten:

Beitragvon dieter1a » Freitag 7. September 2007, 11:44

Leonidas hat geschrieben:

Code: Alles auswählen

import urllib
remote_file = urllib.urlopen('http://dein.server.vielleicht.mit.sinnloser.berlin/tld/und.deiner.datei.txt')
remote_file_contents = remote_file.read()
remote_file.close()

Die Verbindung klappt soweit.
Der Server liefert mir eine Integer-Variable mit Namen ex.
Jetzt möchte ich natürlich diese Variable extraieren und auswerten.
Wie komme ich an diese Variable?
Das php Script lefert mir mit: echo "ex{".$exist."}ex"; den Integer.
Für ein Code_Schnipsel wäre ich sehr dankbar, weil ich noch lange nicht "der Pythonfachmann" bin.
BlackJack

Beitragvon BlackJack » Freitag 7. September 2007, 12:23

Vielleicht solltest Du mal das Python-Tutorial durcharbeiten.

Und verraten was "Der Server liefert mir eine Integer-Variable mit Namen ex." bedeutet. Der Server liefert Dir eine Zeichenkette. Wie sieht die aus?
Benutzeravatar
dieter1a
User
Beiträge: 75
Registriert: Montag 26. Februar 2007, 13:08
Wohnort: Bad Rothenfelde
Kontaktdaten:

Beitragvon dieter1a » Freitag 7. September 2007, 12:35

Die php-Seite liefer mir keine Zeichenkette, sondern Variablen in denen Datenbankinhalte verpackt sind.
In diesem Fall wird nur die Verbindung zum Server getestet.
Hat die Variable nicht einen bestimmten Wert, sagen wir mal 10, ist die Verbindung zum Server fehlgeschlagen.
Da in der Datenbank auch Vektoren, jede Menge Text, Floatwerte usw gespeichert sind, wäre es doch quatsch mir Zeichenketten liefern zu lassen.
Oder?
BlackJack

Beitragvon BlackJack » Freitag 7. September 2007, 12:45

Also irgendwo besteht hier ein Missverständnis. Ich dachte Du holst aus einem Python-Skript heraus Daten per `urllib`!? Da werden Bytes übertragen, d.h. eine Folge oder Kette von Bytes, die in Python mit dem Datentyp `str` also als Zeichenkette verarbeitet werden.
Benutzeravatar
dieter1a
User
Beiträge: 75
Registriert: Montag 26. Februar 2007, 13:08
Wohnort: Bad Rothenfelde
Kontaktdaten:

Beitragvon dieter1a » Freitag 7. September 2007, 12:57

Ich sende an die .php auf dem Server Variablen mit unterschiedlichen Inhalten. Das können schonmal bis zu 10 Variablen sein, die dann im php-Script je nach Name der Variablen ausgewertet werden und die Datenbank wird mit den Inhalten gefüttert.
Das gleiche passiert bei einer Datenbankabfrage, nur erwarte ich dann ebenfalls bis zu 10 Variablen die mir eine .php zurückliefert und die ich in der Animation mit Python auswerte.
Ich frage doch nicht die Datenbank 10 mal hintereinander nach Datenbankeinträgen der unterschiedlichsten Spalten ab.
Ich hoffe mich verständlich genug ausdrücken zu können. :oops:
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Freitag 7. September 2007, 13:20

dieter1a hat geschrieben:Das gleiche passiert bei einer Datenbankabfrage, nur erwarte ich dann ebenfalls bis zu 10 Variablen die mir eine .php zurückliefert und die ich in der Animation mit Python auswerte.

Die Sache ist die, dass die PHP-Seite *immer* Strings rausgibt. Jede PHP-Seite, egal was sie anzeigt.

Dieser String wird im meinem Beispiel nun in ``remote_file_contents`` gespeichert und du kannst ihn beispielsweise mit ``print`` anzeigen lassen.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
dieter1a
User
Beiträge: 75
Registriert: Montag 26. Februar 2007, 13:08
Wohnort: Bad Rothenfelde
Kontaktdaten:

Beitragvon dieter1a » Freitag 7. September 2007, 13:29

Ja, Leonidas,

ich war so dumm und hatte mir die remote_file anzeigen lassen.
Sorry.
jetzt bekomme ich genau das, was mir die .php liefert.
Nämlich ex{10}ex.
Jetzt kann ich den Inhalt der Variablen $exist durch herausfiltern des String's zwischen {} weiterverarbeiten.
Es klappt hervorragend und ich bedanke mich vielmals für die tolle Hilfe

Mit freundlichen Grüßen

dieter1a
Benutzeravatar
dieter1a
User
Beiträge: 75
Registriert: Montag 26. Februar 2007, 13:08
Wohnort: Bad Rothenfelde
Kontaktdaten:

Beitragvon dieter1a » Freitag 7. September 2007, 21:02

Nachdem nun alles eigentlich perfekt funktioniert, hat sich ein neues Problem ergeben.
Weil Blender ja seine eigenen Module mitliefert, brauchte auf dem Rechner auf dem die Animation.exe gestartet wurde, kein Python installiert sein.
Das hat sich seit der Verwendung von urllib und re geändert, was auch nicht weiter tragisch ist.
Jetzt stellt sich mir die Frage, ist es möglich entweder vor dem Download der Animation oder vor dem ersten Start der Animation herauszufinden ob Python installiert ist, um dann gegebenenfalls eine Installation einzuleiten?

Edit:
Kann man eventuell das Importieren von os mit try: except: so abfangen, dass keine Ausgabe im shell-Fenster erscheint wenn os nicht da ist?
Ohne Python-Installation kann ich nämlich aus einer Blender-Animation.exe heraus nicht auf das Modul os zu greifen.
Wird aber auf Grund eines Fehlers eine Konsolenausgabe veranlasst, hängt Python in der Animation, weil es keine Konsole gibt.
Wenn so etwas gehen würde, könnte man damit eine Installation einleiten.
Ich habe aber keinen Plan wie man so etwas hin kriegt.
Benutzeravatar
dieter1a
User
Beiträge: 75
Registriert: Montag 26. Februar 2007, 13:08
Wohnort: Bad Rothenfelde
Kontaktdaten:

Beitragvon dieter1a » Samstag 8. September 2007, 00:57

Es ging leichter als ich dachte.
[code=]try:
import os
except:
tue etwas anderes[/code]
Das klappt wunderbar ohne Shell Fensterausgabe.
Gruß
dieter1a

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]