Python: 如何按名称导入

Python: How to import by name

if __name__ == "__main__":
  from SettingsHandler import YamlParser
  from UIComponents.IncrementSlider import IncrementSlider
  from UIComponents.ToggleSwitch import ToggleSwitch
  from UI.SettingsPane import SettingsPane
  #from KeyStrokeWrapper import KeyStrokeWrapper
else:
  from Handlers.SettingsHandler import YamlParser
  from Handlers.KeyStrokeWrapper import KeyStrokeWrapper
  from Handlers.UIComponents.IncrementSlider import IncrementSlider
  from Handlers.UIComponents.ToggleSwitch import ToggleSwitch
  from Handlers.UI.SettingsPane import SettingsPane

这开始变得荒谬了,我如何仅按文件名导入?

例如:导入 IncrementSlider 而不是 from Handlers.UIComponents.IncrementSlider import IncrementSlider

您可以简单地说 import X,其中 X 是该文件或模块名称,如果您必须从那里引用特定的东西,只需说“X.YYY”,其中 Y 是那个具体的事情。当你说

时你就这样做了
from Handlers.SettingsHandler import YamlParser

确保如果您导入文件夹,该文件夹中有一个 __init__.py 文件。 让我知道它是如何工作的!

这算不上什么答案或解决方案,而是我遇到的类似情况。

我在 scrapy 框架中遇到了类似的问题,我重复了 from x import 大约 7 次。我通过更改 PYTHONPATH 环境变量以指向模块所在的目录来解决这个问题,但要小心!因为当我这样做时,scrapy 看不到它的 options.py 文件(未明确导入)所以我不得不从 shell.

更改一些与 scrapy 相关的变量

Google 如何更改 OS 的 PYTHONPATH 环境变量。我还建议在这样做之前使用虚拟环境,以避免弄乱你的 python system-wide.

条件导入让我觉得有些不对劲。您应该有一个顶层包,例如:

MyEpicPackage
- __init__.py
- Handlers
  - __init__.py
  - more_files.py
- another_sub_package
  - __init__.py
  - more_files.py

而不是相对导入,只需从包内部导入包中的所有内容,无需考虑相对导入from MyEpicPackage import Handlersfrom MyEpicPackage.subpackage.file import MyClass 等.


如果还是不行,使用importlib.import_module:

import_module(name, package=None)
    Import a module.
    The 'package' argument is required when performing a relative import. It
    specifies the package to use as the anchor point from which to resolve the
    relative import to an absolute import.

该包将是您的顶级包,需要 __init__.py