【问题标题】:Discovering Jython modules in Java .jar at runtime?在运行时发现 Java .jar 中的 Jython 模块?
【发布时间】:2018-08-16 20:06:46
【问题描述】:

如果 Jython 模块以已编译的 .py$class 文件形式存在于 Java .jar 中,有没有办法在运行时发现包中的 Jython 模块?

假设我有一个模块foo 包含函数frobify。我团队中的其他人正在提供一个包bar,其中包含模块:

bar/
  __init__.py
  tweedledee.py
  tweedledum.py
  walrus.py
  carpenter.py

他们使用 Jython 将其中的每一个编译成 .py$class 文件,然后将包含所有 .py$class 文件的 bar 目录转换成 bar.jar

然后我们运行 Jython 并执行以下命令:

import foo
import bar

foo.frobify(bar)

我想在哪里写 frobify() 来做到这一点:

def frobify(package):
   for module in get_modules(package):
      do_something_with(module)

我如何实现get_modules() 以便它返回提供的包内的模块列表?我宁愿采用这种方法,也不愿强迫我的客户明确地传递模块列表。

【问题讨论】:

  • hmm...我刚刚以交互方式运行了一个 Jython 提示,看起来 dir(package) 包含它下面的模块,即使您只是导入包本身。
  • 哦,废话,只有当包在 init.py 中显式导入其子模块时才有效

标签: python jython discovery


【解决方案1】:

嗯。看起来pkgutil 可以这样做:

import sys
import pkgutil

def get_modules():
    pkg = sys.modules[__name__]
    return [importer.find_module(name).load_module(name)
                 for importer, name, ispkg 
                 in pkgutil.iter_modules(pkg.__path__)]

它适用于 Jython 2.5.3 和 Python 2.7.1

【讨论】:

    猜你喜欢
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多