我正在尝试导入python模块而不导入该模块的导入。我正在挖掘一下,但是在导入文件时排除任何命令的唯一方法是if __name__ == "__main__":
但该模块也是由模块导入的各种其他模块导入的,所以我不能将导入放在if __name__ == "__main__":
之下
知道如何解决这个问题吗?
我之所以不想导入这些模块的原因,那些模块也可以从jar jython envioronment运行并导入java.lang函数。我只需要在没有整个文件的情况下访问该文件中的一些函数,并导入那些模块break make script。我试图访问的函数不需要任何依赖模块啊。
我通过'从moduleX导入f1,f2,f3'
导入答案 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的项目(例如在模块中导入和使用的库模块)。 (强调我的)