Mon*_*all 3 python python-import importerror
与__init__.py在目录中,我能够将其导入
from subdirectory.file import *
Run Code Online (Sandbox Code Playgroud)
但我希望导入该子目录中的每个文件;所以我试过了
from subdirectory.* import *
Run Code Online (Sandbox Code Playgroud)
这不起作用。有什么建议?
如果您有以下结构:
$ tree subdirectory/
subdirectory/
??? file1.py
??? file2.py
??? file3.py
Run Code Online (Sandbox Code Playgroud)
并且您希望程序自动选取位于其中的每个模块subdirectory并以某种方式对其进行处理,您可以按如下方式实现:
import glob
# Get file paths of all modules.
modules = glob.glob('subdirectory/*.py')
# Dynamically load those modules here.
Run Code Online (Sandbox Code Playgroud)
有关如何动态加载模块,请参阅此问题。
在你的subdirectory/__init__.py,你可以通过导入所有本地模块:
from . import file1
from . import file2
# And so on.
Run Code Online (Sandbox Code Playgroud)
您可以通过以下方式导入本地模块的内容
from .file1 import *
# And so on.
Run Code Online (Sandbox Code Playgroud)
然后您可以通过以下方式导入这些模块(或内容)
from subdirectory import *
Run Code Online (Sandbox Code Playgroud)
使用该属性__all__,__init__.py您可以控制在from ... import *语句期间将准确导入的内容。因此,如果您不想file2.py被导入,例如您可以这样做:
__all__ = ['file1', 'file3', ...]
Run Code Online (Sandbox Code Playgroud)
您可以通过访问这些模块
import subdirectory
from subdirectory import *
for name in subdirectory.__all__:
module = locals()[name]
Run Code Online (Sandbox Code Playgroud)
小智 5
在尝试了一些不同的解决方案后找到了这个方法(如果相邻目录中有一个名为“folder”的文件夹):
for entry in os.scandir('folder'):
if entry.is_file():
string = f'from folder import {entry.name}'[:-3]
exec (string)
Run Code Online (Sandbox Code Playgroud)