从子文件夹导入模块
我想把子文件夹当作模块来导入。所以每个子文件夹里都有一个 __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
这里不需要去调整你的 PYTHONPATH
或 sys.path
。
要在一个包里正确使用绝对导入,你需要把“根”包的名字也加上,比如:
from dirFoo.dirFoo1.foo1 import Foo1
from dirFoo.dirFoo2.foo2 import Foo2
或者你可以使用 相对导入:
from .dirfoo1.foo1 import Foo1
from .dirfoo2.foo2 import Foo2