我试图导入python模块,而不导入该模块。我只是研究了一下,但是在导入文件时排除运行任何命令的唯一方法是if __name__ == "__main__":,但是模块也是由其他模块导入的,这些模块使模块导入,所以我不能将导入放在if __name__ == "__main__":下面--知道如何解决这个问题吗?
我不想导入这个模块的原因是,这些模块也可以从和导入java.lang函数中运行。我只需要访问该文件中的几个函数,而不需要全部访问,导入这些模块就会破坏make。我试图访问的函数不需要模块ahs的任何依赖项。
我通过‘从moduleX导入f1,f2,f3’导入
发布于 2013-04-12 18:07:10
您可以使用导入钩子来解决这个问题。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-12 17:22:57
如果您想使用from module import *而不包括在module中导入的所有内容,那么您应该在module中定义变量__all__。这个变量应该是一个字符串列表,命名应该导入的类、变量、模块等。
来自python文档
如果标识符列表被星号(
*)替换,则模块中定义的所有公共名称都绑定在导入语句的本地命名空间中。
和
由模块定义的公共名称是通过检查模块名称空间中名为
__all__的变量来确定的;如果定义了,则必须是由该模块定义或导入的字符串序列。__all__中给出的名称都被认为是公共的,并且必须存在。如果未定义__all__,则该公共名称集包含模块名称空间中的所有名称,这些名称不以下划线字符(_) .开头,目的是避免意外导出不属于的项(例如在模块中导入和使用的库模块)。(强调地雷)
https://stackoverflow.com/questions/15977072
复制相似问题