"TypeError: 'module' Objekt ist nicht abrufbar" mit Jython

Ich habe ein Python-Modul, bestehend aus import_ical.py und __init__.py in meinem Verzeichnis. Das Aufrufen dieses Moduls aus der Konsole funktioniert, wenn: python -m .import_ical .import_ical.py

Wenn ich das gleiche Modul mit Jython nenne, bekomme ich:

 TypeError: 'module' object is not callable at org.python.core.Py.TypeError(Py.java:263) at org.python.core.PyObject.__call__(PyObject.java:390) at org.python.core.PyObject.__call__(PyObject.java:496) at services.imports.CalendarImporter.importFromUrl(CalendarImporter.java:53) at services.imports.CalendarImporterTest.testMultipleEventsImport(CalendarImporterTest.java:21) [...] 

CalendarImporter.importFromUrl () führt Folgendes aus:

 PythonInterpreter interpreter = new PythonInterpreter(); interpreter.exec("import sys"); interpreter.exec("sys.path.append('<dir>')"); interpreter.exec("sys.path.append('/home/<user>/.local/lib/python2.7/site-packages')"); interpreter.exec("import import_ical"); PyObject importIcalPy = interpreter.get("import_ical"); PyObject pythonResult = importIcalPy.__call__(<parameters go here>); 

Wenn ich meinen JUnit-Test ( CalendarImporterTest ) ausführen, der diesen Jython-Code ausführt, wird in meinem Modulverzeichnis mit dem Namen import_ical $ py.class eine Klassendatei erzeugt. Es enthält die folgenden Zeilen (ua):

 @Filename("<dir>/import_ical.py") public class import_ical$py extends PyFunctionTable implements PyRunnable { [....] static final PyCode __call__$20; [....] public PyObject __call__$20(PyFrame var1, ThreadState var2) { var1.setline(243); PyObject var3 = var1.getglobal("import_ical").__call__(var2, var1.getlocal(0), var1.getlocal(1), var1.getlocal(2)); var1.f_lasti = -1; return var3; } } 

Das Debuggen auf die letzte Zeile meines CalendarImporter Java-Codes, die oben gezeigt wird, gibt mir die folgenden Variablenzustände:

 interpreter = {PythonInterpreter} [...] globals = {PyStringMap} table [...] 1 = {ConcurrentHashMap$MapEntry} "import_ical" -> "<module 'import_ical' from '<dir>/import_ical$py.class'>" [...] [...] [...] importIcalPy = {PyModule} [...] __dict__ = {PyStringMap} table [...] 19 = {ConcurrentHashMap$MapEntry} "import_ical" -> "<function import_ical at 0xc>" [...] 32 = {ConcurrentHashMap$MapEntry} "__call__" -> "<function __call__ at 0x13>" [...] [...] [...] 

Als Python-Neuling kann ich nichts erkennen, was meine Skepsis in Bezug auf die generierte Klassen-Datei des Moduls wecken würde und sogar der oben gezeigte Variablen-Zustand scheint mir zu sagen, dass es in meinem Python-Modul importIcalPy eine richtige Funktion __call__ importIcalPy .

Anmerkung: Ich hatte bereits die Funktion __call__ zu meinem Python-Modul hinzugefügt, um das Modul von "callable" von Jython zu machen und diesen Fehler zu fangen – natürlich ohne Erfolg.

So kann mir bitte jemand sagen: Warum bekomme ich das "nicht kündbare" Fehler? Und was kann ich tun, um es zu verhindern? Jede Hilfe wird sehr geschätzt – danke!

[Kommentar: Ich habe intensiv nach einer Lösung gesucht, sowohl in Stackoverflow als auch mit einer großen Suchmaschine, aber alle Suchergebnisse führen mich zu einem anderen Problem, bei dem ein Python-Modul kein anderes Python-Modul anrufen könnte.]

One Solution collect form web for “"TypeError: 'module' Objekt ist nicht abrufbar" mit Jython”

Endlich, und dank der Hinweise von user2357112 habe ich ein Update gefunden. Ersetzen Sie den Inhalt von CalendarImporter.importFromUrl (), der oben mit dem folgenden Code angezeigt wird:

 PythonInterpreter.initialize(System.getProperties(), System.getProperties(), new String[0]); PythonInterpreter interpreter = new PythonInterpreter(); interpreter.exec("import sys"); interpreter.exec("sys.path.append('<dir>')"); interpreter.exec("sys.path.append('/home/<user>/.local/lib/python2.7/site-packages')"); interpreter.exec("import import_ical"); // set variables if necessary in script: // interpreter.set("__file__", <myFile>); // set system argument variables (one append per variable): interpreter.exec("sys.argv.append('".concat("<myVar>").concat("')")); interpreter.execfile("<fileWithQualifiedPath>"); PyObject importIcalPy = interpreter.get("import_ical"); PyObject pythonResult = importIcalPy.__call__(new PyString("<myScriptArgument>")); 

Hoffe, es wird jemandem helfen.

Python ist die beste Programmiersprache der Welt.