java.io - ModuleNotFoundError

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
arv
User
Beiträge: 7
Registriert: Freitag 7. April 2017, 09:49

Hallo Leute,

ich habe seit heute mit Python zu tun und muss eigentlich nur ein bereits geschriebenes Script zum laufen bringen.
Python 3.6.1 habe ich auch installiert und in meiner Konsole kann ich das Script auch aufrufen:
C:\>python ServerExportHandler1.py
Es kommt aber zu folgender Fehlermeldung:
Traceback (most recent call last):
File "ServerExportHandler1.py", line 3, in <module>
from java.io import FileOutputStream;
ModuleNotFoundError: No module named 'java'
Also das Modul 'java' wird wohl nicht gefunden. Ich kenne mich mit Python leider noch überhaupt nicht aus.
Kann ich das vielleicht irgendwo runterladen und ins Programm-Verzeichnis packen oder sowas?
Jemand eine Idee was ich machen könnte/sollte?

Hier der Quellcode von ServerExportHandler1.py:

Code: Alles auswählen

#
#
from java.io import FileOutputStream;
from java.lang import System;
from java.io import File;
from org.apache.xml.serialize import OutputFormat;
from org.apache.xml.serialize import XMLSerializer; 

TYPE_USER = "USER"
TYPE_USER_GROUP = "USER_GROUP"
TYPE_RESOURCE = "RESOURCE"
TYPE_RESOURCE_COMPANY = "RESOURCE_COMPANY"
TYPE_CALENDAR = "CALENDAR"
TYPE_PROJECT = "PROJECT" 

def exportNeeded():
	global process_export
	if object_type == TYPE_PROJECT:
	   process_export = 1
	else:
	   process_export = 0 

def execute():
	fileStream = FileOutputStream(File("C:/export/"+(str)(System.currentTimeMillis())+".xml"))
	format = OutputFormat(document);
	format.setEncoding("ISO-8859-1")
	format.setIndenting(1);
	format.setIndent(2);
	loSeri = XMLSerializer(fileStream, format);
	loSeri.serialize(document);
	loSeri = XMLSerializer(System.out, format);
	loSeri.serialize(document);
Danke schonmal für die Hilfe :)
LG
Zuletzt geändert von Anonymous am Montag 10. April 2017, 09:51, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

@arv: Du hast kein Python-Skript sondern ein Jython-Skript.
arv
User
Beiträge: 7
Registriert: Freitag 7. April 2017, 09:49

Ok das erklärt natürlich einiges :oops:

@Sirius3: Danke dir schonmal für die schnelle und aufschlussreiche Hilfe

Habe mir jetzt jython 2.7.0 runtergeladen und installiert.
Ist jetzt vermutlich eine dumme Frage für Leute die sich ein wenig auskennen, aber wie starte ich das Script jetzt mit Jython?

Ich habe mal die jython.exe (Console) aus 'C:\jython2.7.0\bin' aufgerufen und versucht mein Script über den Befehl 'C:\ServerExportHandler1.py' zu starten, bekomme dann aber folgende Meldung:
>>> C:\ServerExportHandler1.py
File "<stdin>", line 1
C:\ServerExportHandler1.py
^
SyntaxError: mismatched input ':' expecting NEWLINE
Sieht da jemand einen Syntax-Fehler in dem Code?
Ich kenne die Syntax leider nicht und habe das Script auch nicht geschrieben, es wurde aber sicherlich auch schon von anderen genutzt, wäre komisch wenn es inhaltliche Fehler hätte.
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

@arv: Du versuchst in der Jython-Shell den Dateinamen auszuführen. Das geht natürlich nicht. Du mußt in der Eingabeaufforderung jython mit Skript starten:
[codebox=bash file=Unbenannt.sh]C:\> C:\jython2.7.0\bin\jython.exe ServerExportHandler1.py[/code]

Und warum liegt ServerExportHandler1.py auf C:\? Da sollte es nicht liegen.
arv
User
Beiträge: 7
Registriert: Freitag 7. April 2017, 09:49

Ja ist richtig, das file muss eigentlich auf dem Server 'hbsrv01' in folgendem Pfad liegen:
C:\Program Files (x86)\PLANOUT\SERVER\webapps\ServerApplication\WEB-INF\classes\scripts\ServerExportHandler1.py
Wollte es einfach halten deshalb C:\

Habe es jetzt gemacht wie du gesagt hast und bekomme dafür jetzt eine andere Meldung:

Code: Alles auswählen

C:\>C:\jython2.7.0\bin\jython.exe ServerExportHandler1.py
Traceback (most recent call last):
  File "ServerExportHandler1.py", line 6, in <module>
    from org.apache.xml.serialize import OutputFormat;
ImportError: No module named apache
Auch wenn ich das Script vom richtigen Pfad aus direkt auf dem Server ausführen will bekomme ich diese Meldung :cry: :

Code: Alles auswählen

C:\Program Files (x86)\PLANOUT\SERVER\webapps\ServerApplication\WEB-INF\classes\
scripts>C:\jython2.7.0\bin\jython.exe ServerExportHandler1.py
Traceback (most recent call last):
  File "ServerExportHandler1.py", line 6, in <module>
    from org.apache.xml.serialize import OutputFormat;
ImportError: No module named apache
Bin echt Ratlos :K
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

@arv: Das ist dann ein Problem der Java-VM. Du hast das Paket org.apache.xml aka. xercesImpl-2.x.y.jar nicht in Deinem JAVACLASSPATH.
arv
User
Beiträge: 7
Registriert: Freitag 7. April 2017, 09:49

Ohh nein, das ganze scheint doch komplizierter zu werden als ich gedacht hatte. Das wollte ich eigentlich vermeiden.
Wobei es schon schön wäre das Script zum laufen zu bringen da ich so auf manuelles Exportieren der Projekte verzichten könnte.

Ich habe mir jetzt das Paket 'xercesImpl-2.9.1-sources.jar' heruntergeladen und versucht es in die Java Bibliothek einzubinden, klappt aber nicht, wahrscheinlich weil ich zu doof bin. Hatte damit aber auch noch nie zu tun bis jetzt. :?
Ich habe nur die aktuelle Java Runtime Environment installiert. Brauche ich dazu etwa auch das Java Developer Kit?
Kann mir jemand erklären wie ich das Paket einbinden kann?
__deets__
User
Beiträge: 14525
Registriert: Mittwoch 14. Oktober 2015, 14:29

Developer Kit sollte nicht notwendig sein, aber du musst den Klassenpfad (CLASSPATH) richtig aufsetzen. Dazu findet sich viel da draussen, wie zB das hier:

http://stackoverflow.com/questions/2215 ... ommandline

Nachtrag: das *sources* Paket ist denke ich eher nutzlos, bzw. wenn es *nur* die Sourcen enthaelt, kannst du damit nichts anfangen. Das "normale" Jar reicht.
arv
User
Beiträge: 7
Registriert: Freitag 7. April 2017, 09:49

Also irgendwie verwirrt mich das noch mehr. Ich habe ich ja gar kein "Projekt" welches ich in Eclipse oder irgendeiner Entwicklungsumgebung entwickle in der ich das jar-file zum CLASSPATH hinzufügen könnte, sondern nur das komische Phyton- bzw. Jython-Script (wie sich mittlerweile rausgestellt hat).
Das steht irgendwie alles nicht in der Beschreibung von wo ich das Script habe. Dachte zuerst ich schmeiße das Script einfach in den angegebenen Ordner und kann es dann in den Server-Einstellungen auswählen oder sowas aber leider Fehlanzeige.

Vielleicht versteh ich ja was komplett falsch und bin die ganze Zeit auf dem Holzweg!?
Hier mal die Beschreibung des Scripts die mir zur Verfügung steht:
Bild
http://imgur.com/a/Hl5A1

Vielleicht kann ja jemand was damit anfangen..
Bin echt ratlos wie ich das Script einbinden soll :K
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

@arv: das hört sich doch so an, als ob das Skript von einem "Server" gestartet wird, der alles schon richtig konfiguriert hat. Warum versuchst Du das Skript händisch zu starten?
BlackJack

@arv: CLASSPATH ist eine Umgebungsvariable die man im Betriebssystem setzt. Nichts anderes macht eine IDE wenn man dort etwas zum CLASSPATH hinzufügt: wenn man das Programm über die IDE ausführt, setzt die vor dem Ausführen diese Umgebungsvariable im Elternprozess der das Java-Programm ausführt.

Du hast ein Jython-Skript. Das heisst da wird ein in Java geschriebener Python-Interpreter — Jython — ausgeführt um dieses Skript auszuführen. Neben dem normalen Python bietet Jython die Möglichkeit mit Java zu interagieren, also beispielsweise Java-Klassen zu importieren und zu verwenden. Was am Anfang des Skriptes ja auch ausgiebig getan wird. Die Java-Standardbibliothek steht automatisch zur Verfügung, wie bei einem Java-Programm. Jython benutzt die ja auch, denn das ist ein Java-Programm. Java-Bibliotheken ausserhalb der Java-Standardbibliothek kann man auch importieren und verwenden. Und da gelten auch die gleichen Regeln wie bei Java: sie müssen über den CLASSPATH bekannt gemacht werden, damit man sie importieren kann.

Das wird Dir letztendlich aber alles nichts nützen wenn das wie von Sirius3 vermutet von einem Server aus gestartet werden soll, denn es geht nicht nur um diese ”externe” Umgebung, sondern innerhalb des Skripts taucht auch `document` auf, was nirgends im Skript definiert ist. Das wird ziemlich wahrscheinlich von dem Server zur Verfügung gestellt. Ich sehe nicht wo das sonst herkommen soll.
arv
User
Beiträge: 7
Registriert: Freitag 7. April 2017, 09:49

@Sirius3 und BlackJack:
Ja ihr habt natürlich völlig recht, das Script soll von dem Server aus gestartet werden, war etwas missverständlich von mir.
Ich bin per Remotedesktop auf dem Server drauf auf dem der PLANOUT-Server läuft.
Es gibt auch eine Webbasierte Serverapplikation in der man Einstellungen vornehmen kann.
Da gibt es auch einen Reiter 'Extras' mit einer leeren Tabelle 'Serverscripte'.
Ich hatte als ich damit Anfing eigentlich gedacht ich kopiere das Script (also die Datei 'ServerExportHandler1.py') in das angegebene Verzeichnis 'scripts' auf dem Server (hab ich getan) und bekomme es dann in dieser Liste 'Serverscripte' zu sehen, leider war dem nicht so weshalb ich dachte dass ich etwas falsch mache woraufhin ich bei euch nachgefragt habe.
Ich hätte das vielleicht gleich zu Beginn erwähnen sollen sorry :oops:

Jedenfalls bin ich mir mittlerweile nicht mehr ganz sicher, ob diejenigen die diese Doku geschriebene haben es auch ganz zuende gedacht haben...
Die Umgebungsvariable CLASSPATH habe ich mittlerweile gesetzt und entsprechend angepasst.

Also ich denke auch dass das Script über den 'PLANOUT-Server' gestartet werden muss und ich denke dass das hier sein müsste, ist es nur leider nicht: :K
Bild
Eigentlich würde ich erwarten, dass in der Liste mein Script auftaucht sobald ich es im Ordner 'scripts' ablege, von daher wird wohl was grundsätzlich nicht in Ordnung sein, seht ihr das auch so oder könnte ich noch was anders machen?
Denn falls ja ist das ganze vermutlich sowieso hinfällig da mir dann ja eh niemand helfen könnte.
Ein dickes Danke an alle die mich Unterstützt haben :)
BlackJack

@arv: Für mich sieht das nicht so aus als würden in der Tabelle die Skripte stehen sondern regelmässige Jobs. Denn wo sollte der Inhalt der beiden hinteren Spalten herkommen wenn in der ersten automatisch die Skripte stehen würden?

Zum Ausführen eines Skriptes wird recht wahrscheinlich die Schaltfläche „Skript ausführen“ da sein.

Eventuell reicht es auch nicht ein Skript da einfach zu speichern ohne dem Server zu sagen das es da ist, zum Beispiel in dem man ihn dazu bringt danach zu suchen, neu zu starten, oder irgend etwas in der Richtung. Das sind aber letztendlich alles nicht wirklich Python-Fragen.
arv
User
Beiträge: 7
Registriert: Freitag 7. April 2017, 09:49

Also nur nochmal der Vollständigkeit wegen:

Das Script wird eigentlich jedes mal beim abspeichern eines Projekts ausgeführt.
Das Problem war, dass der Client zwar abspeichern konnte, da er die Daten direkt in die Datenbank geschrieben hat und diese Verbindung funktionierte. Zum auslösen des Scripts allerdings wird beim speichern auch ein Befehl an den Server geschickt um diesem mitzuteilen dass gespeichert wurde und er jetzt das Script anstoßen soll. Und eben diese Verbindung von Client zu Server war blockiert da der dafür verwendete Port schon anderweitig belegt war.

Jetzt läuft es zum Glück wie es soll.

Vielen Dank an alle die mich bei meiner "in die Irre führenden" Suche nach dem Problem unterstützt haben. :lol:
Antworten