我有以下文件排列:
python
|---- main.py
|---- files
|---- folder1
|---- a.py, a1.py, ...
|---- folder2
|---- b.py, b1.py, ...
我想将我的模块a.py
和b.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。然后您得到了一个包文件,其中包含子包folder1和folder2。在此之后,您可以从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
成为a
和a1
是模块的包,你需要在folder1
中放一个__init__.py
,然后做import folder1
。如果您进一步希望能够执行from folder1 import *
并导入a
和a1
,则需要在__init__.py
中放入导入a
和a1
的代码。
如果文件夹中有很多文件,希望能够以结构化的方式导入,则应该将该文件夹制作成一个包。
查看文件夹结构,您可以做的是,简单地
from files.folder1 import a , a1
from files.folder2 import b , b1
这应该有助于
附加功能:我最近想到了一个问题,导入pip包却没有实际安装,然后我做的是。。。i pip在虚拟环境中安装了包,并只复制了包名的文件夹
例如。如果包名是qwikidata,那么我转到/Lib文件夹,只复制了qwikidata文件夹,并将其粘贴到我的项目的根目录中,在您的情况下,main.py文件在那里,pip卸载了包,以避免错误
现在我可以导入这个包,而无需实际安装,因为这个包在项目的根文件夹中
如果项目不是那么复杂,那么它应该是好的,但我不推荐这种安装包的方式。
当你想在其他机器上运行你的项目,而你没有互联网连接时,这会有所帮助。