导入模块而不导入该模型导入

时间:2013-04-12 17:05:50

标签: python import

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

我之所以不想导入这些模块的原因,那些模块也可以从jar jython envioronment运行并导入java.lang函数。我只需要在没有整个文件的情况下访问该文件中的一些函数,并导入那些模块break make script。我试图访问的函数不需要任何依赖模块啊。

我通过'从moduleX导入f1,f2,f3'

导入

2 个答案:

答案 0 :(得分: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>

这可能足以让事情奏效。这是一个令人讨厌,讨厌的黑客攻击,但是如果你真的无法修改有问题的模块,那么这可能是你能做到的最好的。

答案 1 :(得分:-1)

如果您想使用from module import *而不包含module中导入的所有内容,则应在__all__中定义变量module。该变量应该是一个字符串列表,用于命名应该导入的类,变量,模块等。

来自python文档

  

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

  

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