Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从Python中的不同文件夹导入所有文件_Python_Python Import_Importerror - Fatal编程技术网

如何从Python中的不同文件夹导入所有文件

如何从Python中的不同文件夹导入所有文件,python,python-import,importerror,Python,Python Import,Importerror,使用目录中的\uuuu init\uuuuu.py,我可以通过 from subdirectory.file import * 但我希望导入该子目录中的每个文件;所以我试过了 from subdirectory.* import * 这是行不通的。有什么建议吗?如果您有以下结构: $ tree subdirectory/ subdirectory/ ├── file1.py ├── file2.py └── file3.py 您需要一个程序自动拾取位于该子目录中的每个模块,并以某种方式对其

使用目录中的
\uuuu init\uuuuu.py
,我可以通过

from subdirectory.file import *
但我希望导入该子目录中的每个文件;所以我试过了

from subdirectory.* import *

这是行不通的。有什么建议吗?

如果您有以下结构:

$ tree subdirectory/
subdirectory/
├── file1.py
├── file2.py
└── file3.py
您需要一个程序自动拾取位于该
子目录中的每个模块
,并以某种方式对其进行处理,您可以按如下方式实现:

import glob

# Get file paths of all modules.
modules = glob.glob('subdirectory/*.py')

# Dynamically load those modules here.
有关如何动态加载模块的信息,请参阅


子目录/\uuuu init\uuuu.py
中,您可以通过以下方式导入所有本地模块:

from . import file1
from . import file2
# And so on.
您可以通过导入本地模块的内容

from .file1 import *
# And so on.
import subdirectory
from subdirectory import *

for name in subdirectory.__all__:
    module = locals()[name]
然后,您可以通过导入这些模块(或内容)

使用
\uuuu init\uuuuuuuuupy
中的属性
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。。。导入*
语句。因此,如果您不希望导入
file2.py
,例如,您可以执行以下操作:

__all__ = ['file1', 'file3', ...]
您可以通过以下方式访问这些模块:

from .file1 import *
# And so on.
import subdirectory
from subdirectory import *

for name in subdirectory.__all__:
    module = locals()[name]

您的
\uuuu init\uuuu.py
文件应如下所示:

from file1 import *
from file2 import *
然后你可以做:

from subdirectory import *

在尝试一些不同的解决方案后找到此方法(如果在相邻目录中有一个名为“folder”的文件夹):


也许我的回答有点快,是不是对于
子目录
中的每个模块,您希望从模块导入执行
*
(对于数量可变的模块)?尽管我不建议这样做,因为它确实会弄乱您的名称空间。在我的子目录中,我有只包含一个函数的文件。我以后会添加更多的文件,我希望我的代码自动导入所有内容。加上我有两个这样的目录。我想你的答案应该可以解决我的问题,除非我必须手动导入它们,并在每次我向子目录添加文件时添加导入。我该如何准确地使用
\uuu all\uu
<代码>\uuuuuuuuuuuuuuuuuuuu看起来像是一个文件名字符串列表。在for循环中迭代
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。如果确实要导入所有内容,可以在
\uuuu init\uuuuu.py
中使用
from.file import*
。请注意,如果不同的模块具有相同名称的属性,则它们将相互隐藏。您可能还想看看。不会有任何重叠,因为每个函数都与其文件名相同。对不起,我还是很困惑。您有
module=locals()[name]
。这一行到底在做什么?还有没有更简单的方法来导入
\uuu init\uuuuuuuy.py
中的所有内容?像*import*
中的
?@MoneyBall
来自子目录import*
在本地名称空间中带来不同的模块(
locals()
module=locals()。然后,您可以通过
getattr(模块,名称)
访问其属性(如果函数与模块同名)。如果你想让你的程序自动实现新的模块,那么你可以通过
glob.glob('subdirectory/*.py')
和那些模块来解析目录。我喜欢这一个,因为我可以很容易地将它添加到循环中进行过滤:
If entry.name[0]!=''