我有以下文件安排:
python
|--main.py
|files
|-----folder1
|-----a.py,a1.py.....
|-----folder2
|-----b.py,b1.py....
我想将模块a和b.py导入main.py.为此,我在main.py中使用了以下命令:
a = 'C:/python/files/folder1'
sys.path.insert(0, a)
from files.folder1 import *
但是,我无法从folder1导入模块(类似于folder2)。 我收到一个错误:
No module named files.folder1
我无法使用import命令,因为folder1,folder2中有很多python文件......等等。
我在这里错过了什么吗?
答案 0 :(得分:30)
快速回答:
将文件__init__.py
(可以为空)添加到文件夹文件, folder1 和 folder2 。然后你得到一个包文件包 folder1 和 folder2 。在此之后,您可以从main.py导入,如下所示:
from files.folder1 import *
答案 1 :(得分:19)
当我在Python 2.7中执行此操作时,我使用:
import sys
sys.path.append('C:/python/files/folder1')
import a
import a1
<强>更新强>
这是我为将目录中的所有模块导入字典而构建的hack:
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)
我刚刚建造它,它非常hacky但它可能更像你想要的东西。因此,要访问所需的模块,而不是说module_name.thing
,您会说modules["module_name"].thing
答案 2 :(得分:2)
如果您将folder1
添加到路径中,则这并不意味着您可以将folder1
作为模块导入。这意味着您可以导入folder1中的文件。所以你可以这样做:
import a
import a1
如果您希望folder1
成为a
和a1
为模块的软件包,则需要在__init__.py
中添加folder1
,然后做import folder1
。如果您希望能够执行from folder1 import *
并拥有导入a
和a1
,则需要在导入__init__.py
的{{1}}中添加代码, a
。
如果您希望能够以结构化方式导入文件夹中的大量文件,则应将该文件夹放入包中。
答案 3 :(得分:2)
我无法使用import命令,因为folder1,folder2中有很多python文件......等等。 我在这里错过了什么吗?
我相信你缺少的部分是每个文件夹中的 __ init __。py 文件。该文件应包含 __ all __ 变量,该变量列出了将导入的所有子模块:from somepackage.subpackage import *
。
这在Python Tutorial section on Packages中都得到了优雅的解释。
希望这会有所帮助: - )
答案 4 :(得分:0)
看看文件夹结构,你能做的就是,很简单
from files.folder1 import a , a1
from files.folder2 import b , b1
这应该有帮助
.
附加: 我最近想到了一个问题,即导入 pip 包而不实际安装它们, 然后我所做的是...... 我 pip 在虚拟环境中安装了该软件包,并仅复制了软件包名称的文件夹
例如。如果包名称是 qwikidata ,那么我转到 /Lib 文件夹并仅复制 qwikidata 文件夹并将其粘贴到我的项目的根目录中,在您的情况下, main.py 文件所在的位置并且 pip 卸载了该包,以避免错误
现在我可以导入该包而无需实际安装它,因为该包位于我的项目根文件夹中
如果项目不是那么复杂,那么应该没问题,但我不推荐这种安装包的方式。
当您想在其他机器上运行您的项目而您没有互联网连接时,它会有所帮助。