当前位置: 首页 > 面试题库 >

是什么导致python模块两次导入?

姚德容
2023-03-14
问题内容

据我了解,python模块永远不会导入两次,即该模块中的代码仅在首次导入时才执行。随后的import语句只需将模块添加到导入范围即可。

我有一个名为“ TiledConvC3D.py”的模块,但似乎已多次导入。我使用pdb在该模块的代码顶部打印堆栈。

这是从第一次执行模块开始的堆栈跟踪的结尾:

File "<anonymized>/python_modules/Theano/theano/gof/cmodule.py", line 328, in refresh
  key = cPickle.load(open(key_pkl, 'rb'))
File "<anonymized>/ops/TiledConvG3D.py", line 565, in <module>
  import TiledConvC3D
File "<anonymized>/ops/TiledConvC3D.py", line 18, in <module>
  pdb.traceback.print_stack()

它将继续执行多次。但是,第二次调用的完整堆栈跟踪不会显示对的任何调用reload,因此不应执行这些执行:

File "sup_train_conj_grad.py", line 103, in <module>
  dataset = Config.get_dataset(dataset_node)
File "<anonymized>/Config.py", line 279, in get_dataset
  from datasets import NewWiskott
File "<anonymized>/datasets/NewWiskott.py", line 16, in <module>
  normalizer_train = video.ContrastNormalizer3D(sigma, global_per_frame = False, input_is_5d = True)
File "<anonymized>/util/video.py", line 204, in __init__
  self.f = theano.function([input],output)
File "<anonymized>/python_modules/Theano/theano/compile/function.py", line 105, in function
  allow_input_downcast=allow_input_downcast)
File "<anonymized>/python_modules/Theano/theano/compile/pfunc.py", line 270, in pfunc
  accept_inplace=accept_inplace, name=name)
File "<anonymized>/python_modules/Theano/theano/compile/function_module.py", line 1105, in orig_function
  fn = Maker(inputs, outputs, mode, accept_inplace = accept_inplace).create(defaults)
File "/u/goodfeli/python_modules/Theano/theano/compile/function_module.py", line 982, in create
  _fn, _i, _o = self.linker.make_thunk(input_storage = input_storage_lists)
File "<anonymized>/python_modules/Theano/theano/gof/link.py", line 321, in make_thunk
  output_storage = output_storage)[:3]
File "<anonymized>/python_modules/Theano/theano/gof/cc.py", line 1178, in make_all
  output_storage = node_output_storage)
File "<anonymized>/python_modules/Theano/theano/gof/cc.py", line 774, in make_thunk
  cthunk, in_storage, out_storage, error_storage = self.__compile__(input_storage, output_storage)
File "<anonymized>/python_modules/Theano/theano/gof/cc.py", line 723, in __compile__
  output_storage)
File "<anonymized>/python_modules/Theano/theano/gof/cc.py", line 1037, in cthunk_factory
  module = get_module_cache().module_from_key(key=key, fn=self.compile_cmodule)
File "<anonymized>/python_modules/Theano/theano/gof/cc.py", line 59, in get_module_cache
  return cmodule.get_module_cache(config.compiledir)
File "<anonymized>/python_modules/Theano/theano/gof/cmodule.py", line 576, in get_module_cache
  _module_cache = ModuleCache(dirname, force_fresh=force_fresh)
File "<anonymized>/python_modules/Theano/theano/gof/cmodule.py", line 268, in __init__
  self.refresh()
File "<anonymized>/python_modules/Theano/theano/gof/cmodule.py", line 326, in refresh
  key = cPickle.load(open(key_pkl, 'rb'))
File "<anonymized>/ops/TiledConvV3D.py", line 504, in <module>
  import TiledConvG3D
File "<anonymized>/ops/TiledConvG3D.py", line 565, in <module>
  import TiledConvC3D
File "<anonymized>/ops/TiledConvC3D.py", line 22, in <module>
  pdb.traceback.print_stack()

此外,我还检查的ID
__builtin__.__import__。在主脚本的开头,我先导入__builtin__并打印,id(__builtin__.__import__)然后再进行其他任何导入。我还id(__builtin__.import__)从被多次导入的模块内部打印,并且id的值不变。

除了调用reload和override之外,还有其他机制__builtin__.__import__可以解释我的模块多次加载吗?


问题答案:

如果在路径中两次找到Python模块,则该模块可以被导入两次。例如,假设您的项目的布局如下:

  • src /
    • 套餐1 /
    • 垃圾邮件
    • eggs.py

假设您的PYTHONPATH(sys.path)包含src和src / package1:

PYTHONPATH=/path/to/src:/path/to/src/package1

在这种情况下,您可以两次导入相同的模块,如下所示:

from package1 import spam
import spam

而且Python会认为它们是不同的模块。那是怎么回事吗?

另外,根据下面的讨论(针对搜索此问题的用户),可以两次导入模块的另一种方法是在第一次导入过程中是否存在异常。例如,如果垃圾邮件导入了鸡蛋,但是导入鸡蛋导致
模块内部 出现异常,则可以再次将其导入。



 类似资料:
  • 问题内容: 我在搜索我的网站上具有自动完成/提前输入功能。我看到他们有时是一个例外。我们正在使用代理服务器。 引起原因:java.net.ConnectException:连接被拒绝 这是我的编码方式 谁能告诉我为什么我只在某个时候得到这个例外?是否可能是由于从Android应用程序发出搜索请求而导致此异常,因为我们的网站不支持从android应用程序发出请求 问题答案: 当您尝试打开与IP地址/

  • 问题内容: 我将Java库打包为JAR,当我尝试从中调用方法时会抛出很多s。这些错误似乎随机出现。哪些类型的问题可能导致此错误? 问题答案: 这意味着你对库进行了一些不兼容的二进制更改,而无需重新编译客户端代码。 Java语言规范§13详细介绍了所有这些更改,最显着的是将非非私有字段/方法更改为,反之亦然。 根据新库重新编译客户端代码,你应该一切顺利。 更新:如果发布公共库,则应尽可能避免进行不兼

  • 问题内容: 编写python模块时,是否有办法防止客户端代码两次将其导入?就像c / c ++头文件一样: 非常感谢! 问题答案: Python模块不会多次导入。仅运行两次导入将不会重新加载模块。如果要重新加载它,则必须使用该语句。这是一个演示 是单行的模块 这是多次导入尝试的屏幕记录。

  • 问题内容: 我已尝试找到有关最佳使用还是全面的指南。我刚开始使用Python,并且正在尝试着眼于最佳实践。 基本上,我希望有人能分享他们的经验,其他开发人员有什么喜好,以及避免遇到麻烦的最佳方法是什么? 问题答案: 和之间的区别主要是主观的。选择最喜欢的一个,并在使用中保持一致。这里有一些要点可以帮助你做出决定。 优点: - 减少维护你的import报表。无需添加任何其他导入即可开始使用模块中的另

  • 问题内容: 我注意到我今天想解释的东西很奇怪。我不是100%不确定如何将其表达为一个问题,所以google是不可能的。由于某些奇怪的原因,日志记录模块无权访问模块logging.handlers。如果您不相信我,请自己尝试: 谁能解释为什么会这样? 问题答案: 在Python中,需要先导入模块,然后才能对其进行访问。仅导入日志记录模块。碰巧这是一个带有子模块的软件包,但是那些子模块仍然不会自动加载

  • 问题内容: 谁能建议我在python中导入模块的最pythonic方法是什么?让我解释一下- 我已经阅读了很多python代码,并发现了几种不同的方式来导入模块,或者更确切地说,是何时导入: 使用一个模块/几个模块,其中包括整个项目所需的所有导入(第三方模块),因此所有导入都集中在几个模块中,因此易于维护导入。当任何单个模块需要导入任何模块时,都会询问引用模块。例如,在我们的项目中,我们分离了名为