【问题标题】:Import module defined in another module导入在另一个模块中定义的模块
【发布时间】:2016-06-10 19:44:17
【问题描述】:

我有以下设置。第一个文件 (config.py) 定义了一个路径,它告诉 file1.py 要导入哪个模块。

#file:config.py
moduleToBeImported="/here/is/some/path/file2.py"
import file1

然后在file1.py中,导入config.py中定义的模块

#file:file1.py
import imp
foo = imp.load_source('module.name',moduleToBeImported)

是否可以将变量moduleToBeImported从config.py传递给file1.py?

在当前设置中,我得到了预期的错误:NameError: name 'moduleToBeImported' is not defined

【问题讨论】:

  • foo = ... 放入函数中,并在config.py 中执行以下操作:function(moduleToBeImported)?
  • 为什么要这样导入模块?您是否正在尝试创建插件系统?为什么不能像普通 python 模块一样简单地安装file2
  • 也许有更好的方法可以做到这一点,但我正在开发一个框架,我希望 file1.py 不被用户更新。用户将创建 config.py 文件和 file2.py 文件,但不会更新 file1.py 文件。然后要运行程序,他们可以简单地运行 config.py 文件,该文件从其他文件中调用函数和类。

标签: python python-2.7 import


【解决方案1】:

简答 -


长答案 - 也许,你可以。 ,你不应该。循环导入会导致导入循环。这很糟糕。

例如,假设您在file1.py 中导入了config.py。一旦你运行file1.py 并调用config.pyconfig.py 中的代码就像任何其他 python 文件一样运行。此时,您最终会尝试从file1.py 导入file1.py

Python 可能会或可能不会在它对您的系统造成严重破坏之前检测到这个循环。

一般来说,循环导入是一种非常糟糕的编码习惯。


你可以做什么 - 你的config.py 应该包含最少的可运行代码。而是将所有配置变量和设置以及通用实用程序方法保留在那里。简而言之,如果file1.py 包含关键代码,则不应将其导入config.py。不过你可以在file1.py 中导入config.py

更多阅读:Python circular importing?

【讨论】:

  • Python 有导入保护。模块只导入一次。如果您在file1 中导入config,然后在config 中导入file1,它将正常工作。循环依赖的大多数问题是当人们尝试从循环导入发生时尚未定义的模块中导入特定符号时。也就是说,我同意问题中的结构没有多大意义,并且可能有更好的方法来实现他们想要的。
  • 感谢您的评论。也许我遗漏了一些东西,但是我想在file1.py中导入的文件实际上是file2.py,所以不会有循环导入。
猜你喜欢
  • 1970-01-01
  • 2018-04-23
  • 2022-01-08
  • 2022-01-19
  • 2020-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多