" TypeError:' module'对象不可调用"使用Jython

时间:2017-04-26 16:12:00

标签: java python module jython callable

我有一个python模块,在我的目录中包含import_ical.py__init__.py。使用时,从控制台调用此模块有效:     python -m .import_ical .import_ical.py

当我使用Jython调用相同的模块时,我得到:

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()执行以下操作:

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>);

当我执行执行此Jython代码的JUnit测试(CalendarImporterTest)时,会在我的模块目录中生成一个类文件,名为 import_ical $ py.class 。它包含以下几行(等等):

@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;
  }
}

调试到我上面显示的CalendarImporter Java代码的最后一行,给出了以下变量状态:

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>"
      [...]
    [...]
  [...]

作为一个蟒蛇新手,我无法发现任何会引起我对模块生成的类文件甚至变量的疑虑。上面显示的状态似乎告诉我在我的python模块__call__中有一个正确的函数importIcalPy

注意:我已经将函数__call__添加到我的python模块中以使模块通过&#34; callable&#34;来自Jython并发现了这个错误 - 显然没有成功。

所以任何人都可以告诉我:为什么我会这样做&#34;不可赎回&#34;错误?我能做些什么来阻止它?非常感谢任何帮助 - 谢谢!

[评论:我已经在Stackoverflow和使用大型搜索引擎中搜索了一个解决方案,但所有搜索结果都会导致另一个问题,即python模块无法调用另一个python模块。]

1 个答案:

答案 0 :(得分:0)

最后,感谢user2357112的提示,我找到了解决方法。使用以下代码替换上面显示的CalendarImporter.importFromUrl()的内容:

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>"));

希望,它会帮助某人。