我想将子文件夹导入为模块。因此,每个子文件夹都包含__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
如果我调用我的foofactory我得到错误,那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
答案 0 :(得分:108)
这里没有必要弄乱你的PYTHONPATH
或sys.path
。
要在包中正确使用绝对导入,您还应该包含“root”包名,例如:
from dirFoo.dirFoo1.foo1 import Foo1
from dirFoo.dirFoo2.foo2 import Foo2
或者您可以使用relative imports:
from .dirfoo1.foo1 import Foo1
from .dirfoo1.foo1 import Foo2
答案 1 :(得分:17)
只是在这里通知。 (来自newbee,keviv22)
永远不要为了您自己的利益,使用空格或符号命名文件夹或文件,例如&#34; - &#34;或&#34; _&#34;。如果你这样做,你可能会面临一些问题。比如说,虽然您的导入命令是正确的,但您无法成功导入这些命名文件夹中可用的文件。
无效的文件夹命名如下:
上面的有效文件夹命名:
我做错了什么:
考虑文件结构。
Parent
. __init__.py
. Setup
.. __init__.py
.. Generic-Class-Folder
... __init__.py
... targetClass.py
. Check
.. __init__.py
.. testFile.py
我想做什么?
我做了什么命令?
from Core.Generic-Class-Folder.targetClass import functionExecute
SyntaxError: invalid syntax
尝试了很多搜索并查看了许多stackoverflow问题,无法确定出错的地方。我多次交叉检查我的文件,我使用__init__.py
文件,插入环境路径并非常担心出了什么问题......
经过很长一段时间,我在和我的一个朋友谈话时想到了这一点。使用这样的命名约定我很愚蠢。我永远不应该使用空格或特殊符号来定义任何文件夹或文件的名称。所以,这就是我想传达的。祝你有个美好的一天!
(抱歉这个巨大的帖子......只是让我的挫折感...... :)谢谢!)
答案 2 :(得分:5)
设置PYTHONPATH环境变量。例如像PYTHONPATH =。:..(对于* nix系列)。
您也可以手动将当前目录(在您的情况下为src)添加到pythonpath:
import os
import sys
sys.path.insert(0, os.getcwd())
答案 3 :(得分:2)
只需创建一个空的__init__.py
文件,并将其添加到root以及python应用程序的所有子目录/文件夹中(如果您有其他python模块)。参见https://docs.python.org/3/tutorial/modules.html#packages
答案 4 :(得分:1)
说您的项目的结构是这样的:
+---MyPythonProject
| +---.gitignore
| +---run.py
| | +---subscripts
| | | +---script_one.py
| | | +---script_two.py
在run.py
内,您可以通过以下方式导入脚本一和二:
from subscripts import script_one as One
from subscripts import script_two as Two
现在,仍然在run.py
内,您可以使用以下命令调用其方法:
One.method_from_one(param)
Two.method_from_two(other_param)
答案 5 :(得分:-2)
即使子文件夹中存在 init .py,并且在导入后添加的所有内容都为“ as”时仍然存在问题
from folder.file import Class as Class
import folder.file as functions