从子文件夹导入模块



我有以下文件排列:

python
|---- main.py
|---- files
|---- folder1
|---- a.py, a1.py, ...
|---- folder2
|---- b.py, b1.py, ...

我想将我的模块a.pyb.py导入到main.py。为此,我在main.py中使用了以下命令:

a = 'C:/python/files/folder1'
sys.path.insert(0, a)
from files.folder1 import *

但是,我无法从folder1导入模块(与folder2类似)。

我得到一个错误:

没有命名为files.folder1的模块

我不能使用import命令,因为folder1、folder2。。。

我在这里错过了什么?

将文件__init__.py(可以为空)添加到文件夹文件文件夹1文件夹2。然后您得到了一个包文件,其中包含子包folder1folder2。在此之后,您可以从main.py导入,如下所示:

from files.folder1 import *

当我在Python 2.7中执行此操作时,我使用:

import sys
sys.path.append('C:/python/files/folder1')
import a
import a1

以下是我构建的一个破解方法,用于将目录中的所有模块导入字典:

import os
import sys
dir_of_interest = 'C:/python/files/folder1'
modules = {}
sys.path.append(dir_of_interest)
for module in os.listdir(dir_of_interest):
if '.py' in module and '.pyc' not in module:
current = module.replace('.py', '')
modules[current] = __import__(current)

我刚刚建造了它,它非常粗糙,但它可能更像你想要的东西。因此,要访问您想要的模块,不要说module_name.thing,而是说modules["module_name"].thing

我不能使用import命令,因为folder1、folder2。。。

我在这里错过了什么?

我相信您缺少的部分是每个文件夹中的__init__.py文件。该文件应包括一个__all__变量,该变量列出了将由from somepackage.subpackage import *导入的所有子模块。

这一切都在关于包的Python教程部分中得到了很好的解释。

如果将folder1添加到路径中,并不意味着可以将folder1作为模块导入。这意味着您可以导入folder1中的文件。所以你可以做:

import a
import a1

如果你想让folder1成为aa1是模块的包,你需要在folder1中放一个__init__.py,然后做import folder1。如果您进一步希望能够执行from folder1 import *并导入aa1,则需要在__init__.py中放入导入aa1的代码。

如果文件夹中有很多文件,希望能够以结构化的方式导入,则应该将该文件夹制作成一个包。

查看文件夹结构,您可以做的是,简单地

from files.folder1 import a , a1
from files.folder2 import b , b1

这应该有助于

附加功能:我最近想到了一个问题,导入pip包却没有实际安装,然后我做的是。。。i pip在虚拟环境中安装了包,并只复制了包名的文件夹

例如。如果包名是qwikidata,那么我转到/Lib文件夹,只复制了qwikidata文件夹,并将其粘贴到我的项目的根目录中,在您的情况下,main.py文件在那里,pip卸载了包,以避免错误

现在我可以导入这个包,而无需实际安装,因为这个包在项目的根文件夹中

如果项目不是那么复杂,那么它应该是好的,但我不推荐这种安装包的方式。

当你想在其他机器上运行你的项目,而你没有互联网连接时,这会有所帮助。

相关内容

  • 没有找到相关文章

最新更新