如何从IPython解释器无缝使用jython类和方法?

时间:2016-07-04 17:06:26

标签: python subprocess ipython jython interpreter

为了在IPython解释器中无缝地使用jython方法和类,我想出了许多扭曲的想法并尝试过:

  • 只需将sys.executable更改为指向jython解释器。导入Java包时失败,因为sys.path_hooks错过了jython用来加载它们的org.python.core.JavaImporter

  • 为我的模块功能编写装饰器。整个想法是:

    • test_module的开头,通过设置以下标志来测试当前解释器是否为jython:withjython = 'jython' in sys.executable
    • 使用装饰器test_function修饰函数@create_jython_decorator(withjython),其代码为:

      def create_jython_decorator(withjython):
      def call_with_jython(function_to_wrap):
          def jython_wrapper(*args, **kwargs):
              if not withjython:
                  args_str = ', '.join(map(str, args)+map(lambda (kw, arg) : '='.join(map(str, (kw, arg))), kwargs.items()))
                  command = ['jython',  '-c', 'from test_module import '+function_to_wrap.func_name+'; '+function_to_wrap.func_name+'('+args_str+')']
                  return subprocess.call(command)
              else:
                  return function_to_wrap(*args, **kwargs)
           return jython_wrapper
       return call_with_jython
      

    因此,当从IPython解释器调用函数test_function时,会发出subprocess调用,该调用使用jython解释器来运行该方法。这有效,但是阻止我检索我的函数的返回值(如果有的话),因为我无法在stdout或返回代码之上检索它。

  • 我试图定义另一个只保留变量jython_proxy的模块_proxy,但无济于事,因为我发现无法让它在subprocess调用后继续存在。

    示意图我在import jython_proxy的开头添加了test_module,并在我的装饰器中使用了jython_proxy._proxy = function_to_wrap(*args, **kwargs)而不是return function_to_wrap(*args, **kwargs)。这不起作用,因为我猜使用subprocess会产生一个完全不同的python会话,而且没有连接到我当前的会话。

在这个阶段,我确信jython解释器或使用我的模块作为脚本肯定足以满足我的需要。我也知道有一个IPython模块,其中包含embedstart_ipython等方法。无论如何,我的尝试中有很多乐趣,我很想知道是否有办法。

0 个答案:

没有答案