从子文件夹导入模块

148 投票
5 回答
233242 浏览
提问于 2025-04-17 10:46

我想把子文件夹当作模块来导入。所以每个子文件夹里都有一个 __init__.py 文件。我的文件夹结构是这样的:

src\
  main.py
  dirFoo\
    __init__.py
    foofactory.py
    dirFoo1\
      __init__.py
      foo1.py
    dirFoo2\
      __init__.py
      foo2.py

在我的主脚本中,我导入了:

from dirFoo.foofactory import FooFactory

在这个工厂文件里,我包含了子模块:

from dirFoo1.foo1 import Foo1
from dirFoo2.foo2 import Foo2

但是当我调用我的工厂时,出现了错误,Python 说它无法导入子模块 foo1 和 foo2:

Traceback (most recent call last):
  File "/Users/tmp/src/main.py", line 1, in <module>
from dirFoo.foofactory import FooFactory
  File "/Users/tmp/src/dirFoo/foofactory.py", line 1, in    <module>
from dirFoo1.foo1 import Foo1
    ImportError: No module named dirFoo1.foo1

5 个回答

11

设置你的PYTHONPATH环境变量。比如可以这样设置:PYTHONPATH=.:..(适用于*nix系统)。

你也可以手动把你当前的目录(在你的情况下是src)添加到pythonpath里:

import os
import sys
sys.path.insert(0, os.getcwd())
30

在这里提醒一下大家。(来自新手,keviv22)

为了你自己的好,千万不要给文件夹或文件起带有符号的名字,比如“-”或“_”。如果你这么做了,可能会遇到一些问题。比如说,虽然你导入的命令是正确的,但你可能无法成功导入那些在这种命名的文件夹里的文件。

以下是无效的文件夹命名:

  • Generic-Classes-Folder
  • Generic_Classes_Folder

以上的有效文件夹命名:

  • GenericClassesFolder 或 Genericclassesfolder 或 genericClassesFolder(或者像这样,单词之间没有空格或特殊符号)

我犯了什么错误:

看看我的文件结构。

Parent
   . __init__.py
   . Setup
     .. __init__.py
     .. Generic-Class-Folder
        ... __init__.py
        ... targetClass.py
   . Check
     .. __init__.py
     .. testFile.py

我想做什么?

  • 我想从 testFile.py 文件中导入 Generic-Class-Folder 文件里的 'targetClass.py' 文件,以便使用 'targetClass.py' 文件中的 "functionExecute" 函数。

我用了什么命令?

  • 在 'testFile.py' 中,我写了命令, from Core.Generic-Class-Folder.targetClass import functionExecute
  • 结果出现了错误,比如 SyntaxError: invalid syntax

我尝试了很多搜索,查看了许多 StackOverflow 的问题,但还是搞不清楚哪里出了错。我多次检查我的文件,使用了 __init__.py 文件,插入了环境路径,心里非常担心到底哪里出了问题……

经过很长很长的时间,我在和朋友聊天时终于搞明白了。我真是傻,居然用这种命名方式。我以后绝对不应该在文件夹或文件的名字中使用空格或特殊符号。所以,我想传达的就是这个。祝你有美好的一天!

(抱歉发了这么长的帖子……只是想发泄一下我的沮丧…… :) 谢谢!)

193

这里不需要去调整你的 PYTHONPATHsys.path

要在一个包里正确使用绝对导入,你需要把“根”包的名字也加上,比如:

from dirFoo.dirFoo1.foo1 import Foo1
from dirFoo.dirFoo2.foo2 import Foo2

或者你可以使用 相对导入

from .dirfoo1.foo1 import Foo1
from .dirfoo2.foo2 import Foo2

撰写回答