在Python中遇到Import语句问题

Having Trouble with Import Statement in Python

我目前的项目结构是这样的。

1
2
3
4
5
6
7
8
9
10
11
python/
    __init__.py
    project_1/
        __init__.py
        program_1.py
    project_2/
        __init__.py
        program_2.py
    project_3/
        __init__.py
        program_3.py

我想从project_3/program_3.py导入一个名为info的类,它来自project_1/program_1.py和project_2/program_2.py。在我的程序_1.py和程序_2.py中,我尝试了以下不起作用的导入语句。

编辑-我通常"cd"到项目1中,然后从那里运行我的程序1.py。

1
2
3
4
5
6
7
8
9
10
11
12
13
from project_3.program_3 import INFO

Traceback (most recent call last):
  File"./program_1.py", line 43, in <module>
    from project_3.program_3 import INFO
ImportError: No module named 'project_3'

from python.project_3.program_3 import INFO

Traceback (most recent call last):
  File"./program_1.py", line 43, in <module>
    from python.project_3.program_3 import INFO
ImportError: No module named 'python'

我将类信息导入Program_1.py和Program_2.py的唯一方法是在Program_1和Program_2的文件夹中复制Program_3.py。我在程序1和程序2中的导入语句将变为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
python/
    __init__.py
    project_1/
        __init__.py
        program_1.py
        program_3.py
    project_2/
        __init__.py
        program_2.py
        program_3.py
    project_3/
        __init__.py
        program_3.py

from program_3 import INFO

这很不方便,因为现在我必须在所有3个位置更新程序_3.py。假设我构建项目文件夹的方式很迟钝:

  • 如何正确/最好地组织我的文件夹,以便我可以从Program_1/2.py调用Program_3.py?
  • 如果我当前的结构没有任何问题,我如何正确地将INFO类导入到Program_1/2.py中?

我已经阅读了python文档,但它没有提到将类从一个子文件夹导入到另一个子文件夹。我还查看了另一个来自堆栈溢出的帖子,但它的结构与我的不一样。

更新1-重要的是要注意,我只是使用项目1/2作为文件夹来组织我的项目。我最初在所有文件夹中都有init.py,因为我不知道自己在做什么。在我的项目_1/program_1.py中,我要导入的唯一模块/包来自项目_3/program_3.py。例子:

1
2
3
4
5
6
7
8
python/
    project_1/
        program_1.py
    project_2/
        program_2.py
    project_3/
        __init__.py
        program_3.py


使用子模块时,需要使用相对导入。在提供的示例中,从program_1导入program_3应该是:

1
from ..project_3 import program_3

然后可以使用INFO类:program_3.INFO

如果您的可执行文件在脚本之外,也就是说,示例中使用模块python的文件应该在python模块之外,那么这就可以工作。

如果部分python包作为脚本执行,则应将-m选项传递给解释器:

1
python3 -m python.project_1.program_1

我希望这有帮助。


前面的解决方案提供了相同的错误。

我用sys找到了一个修复方法:

1
2
3
4
5
import sys
sys.path.append('../')

from project_3 import program_3
...

这样,就可以设置"python"文件夹作为引用(在本例中,它是父文件夹,但可以选择所需的路径)。

希望能有所帮助,