从不同文件夹导入模块

时间:2012-11-28 06:16:00

标签: python

我有以下文件安排:

    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文件......等等。

我在这里错过了什么吗?

5 个答案:

答案 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成为aa1为模块的软件包,则需要在__init__.py中添加folder1,然后做import folder1。如果您希望能够执行from folder1 import *并拥有导入aa1,则需要在导入__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 卸载了该包,以避免错误

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

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

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

相关问题