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 Handlers
、from 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
。
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.
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 Handlers
、from 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
。