gpt4 book ai didi

python - 当 import_module 加载时,从模块引用 python 文件

转载 作者:行者123 更新时间:2023-11-30 22:45:54 26 4
gpt4 key购买 nike

我想使用 importlib 中的 import_module 导入模块。当我这样做时,找不到我从模块引用的文件。如果我从 python shell 正常导入模块(不使用 main.py),它会按预期工作。另外,如果我将 MyModule.py 的路径添加到 sys.path 中,它就可以工作,但据我了解,我不应该这样做(在下面的代码中注释掉)。

当 import_module 加载模块时,如何才能加载我引用的文件?

我有以下文件结构

main.py
subfolders
folder1
__init__.py
MyModule.py
hello.py

main.py的内容

from importlib import import_module

modulename = 'subfolders.folder1.MyModule'
print("Import module ", modulename)
module = import_module(modulename)
m_instance = module.MyModule()

m_instance.module_hello()

MyModule.py的内容

#This is the solution that works but feels wrong
#import os, sys
#sys.path.append(os.path.dirname(__file__))

from hello import hello_world

class MyModule(object):
def __init__(self):
print("Init MyModule")

def module_hello(self):
hello_world()

hello.py的内容

def hello_world():
print("Hello World!")

当我运行这个时,我得到:

c:\git\PythonImportTest>python main.py
Import module subfolders.folder1.MyModule
Traceback (most recent call last):
File "main.py", line 5, in <module>
module = import_module(modulename)
File "C:\Miniconda3\lib\importlib\__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 986, in _gcd_import
File "<frozen importlib._bootstrap>", line 969, in _find_and_load
File "<frozen importlib._bootstrap>", line 958, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 673, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 665, in exec_module
File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed
File "c:\git\PythonImportTest\subfolders\folder1\MyModule.py", line 5, in <module>
from hello import hello_world
ImportError: No module named 'hello'

最佳答案

首先,您需要通过在其中放置空的 __init__.py 来使您的子文件夹目录成为一个包。其次,您需要通过绝对导入或相对导入来导入 hello 模块。

绝对导入:

from subfolders.folder1.hello import hello_world

相对导入:

from .hello import hello_world

您目前的做法是在顶级包(main.py 所在的位置)中查找 hello.py。因为在那里找不到它,所以会出现错误。

Python3 中相对导入的注意事项

您可能从 Python2 切换到了 Python3,这就是您在使用隐式相对导入时遇到麻烦的原因。如PEP404说:

In Python 3, implicit relative imports within packages are no longer available - only absolute imports and explicit relative imports are supported. In addition, star imports (e.g. from x import * ) are only permitted in module level code.

这意味着您的代码应该在 Python2 上运行,但对于 Python3,您必须使用上述选项之一。另请参阅:Changes in import statement python3

关于python - 当 import_module 加载时,从模块引用 python 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41057915/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com