1

我正在尝试导入一个 python 模块而不导入该模块的导入。我正在挖掘一点,但是在导入文件时排除任何命令运行的唯一方法是if __name__ == "__main__": 但是该模块也被其他各种支持模块导入的模块导入,所以我不能将导入放在下面 if __name__ == "__main__": 知道如何解决吗?

我不想导入这些模块的原因是这些模块也可以从 jar jython 环境中运行并导入 java.lang 函数。我只需要访问该文件中的一些函数,而不需要全部并导入这些模块中断 make 脚本。我试图访问的功能不需要任何依赖模块啊。

我通过“从 moduleX 导入 f1、f2、f3”导入

4

2 回答 2

0

您也许可以使用导入挂钩来解决此问题。该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>

这可能足以使事情正常进行。这是一个讨厌的,讨厌的黑客,但如果你真的不能修改有问题的模块,这可能是你能做的最好的。

于 2013-04-12T18:07:10.303 回答
-1

如果您想使用from module import *并且不包含其中导入的所有内容,module那么您应该__all__module. 这个变量应该是一个字符串列表,命名应该导入的类、变量、模块等。

来自 python 文档

如果标识符列表被星号 ( *) 替换,则模块中定义的所有公共名称都绑定在 import 语句的本地命名空间中

模块定义的公共名称是通过检查模块命名空间中的变量来确定的__all__;如果已定义,它必须是由该模块定义或导入的名称的字符串序列。中给出的名称__all__都被认为是公开的,并且必须存在。如果__all__未定义,则公共名称集包括在模块命名空间中找到的所有名称,这些名称不以下划线字符 ( _) [...]开头, 旨在避免意外导出不属于 API 的项目(例如作为在模块中导入和使用的库模块)(强调我的)

于 2013-04-12T17:22:57.860 回答