您也许可以使用导入挂钩来解决此问题。该sys.meta_path
变量是可以覆盖正常导入处理的导入器列表。您可以使用它们来存根仅存在于 Jython 中的模块。这是一个例子:
import types, sys
class Stub(object):
def __getattr__(self, name):
return self
class StubModule(types.ModuleType):
def __getattr__(self, name):
return Stub()
class StubJavaImporter(object):
def find_module(self, fullname, path = None):
if fullname == 'java' or fullname.startswith('java.'):
return self
else:
return None
def load_module(self, fullname):
mod = sys.modules.setdefault(fullname, StubModule(fullname))
mod.__file__ = "<%s>" % self.__class__.__name__
mod.__loader__ = self
mod.__path__ = []
mod.__package__ = fullname
return mod
sys.meta_path.append(StubJavaImporter())
运行此代码后,您可以导入任何以开头的模块java.
并访问其中的任何属性路径。例如:
In [2]: from java.lang import Object
In [3]: Object.equals
Out[3]: <__main__.Stub at 0x14d8b90>
In [4]: Object
Out[4]: <__main__.Stub at 0x14d8b90>
In [5]: Object.foo.bar.baz
Out[5]: <__main__.Stub at 0x14d8b90>
这可能足以使事情正常进行。这是一个讨厌的,讨厌的黑客,但如果你真的不能修改有问题的模块,这可能是你能做的最好的。