为了在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
模块,其中包含embed
或start_ipython
等方法。无论如何,我的尝试中有很多乐趣,我很想知道是否有办法。