从子目录导入Python类

3

我一直在尝试导入一些定义在子目录中的Python类。目录结构如下:

workspace/
    __init__.py
    main.py
    checker/
       __init__.py
       baseChecker.py
       gChecker.py

baseChecker.py 看起来类似于:

import urllib
class BaseChecker(object):
    # SOME METHODS HERE
文件:

import baseChecker # should import baseChecker.py
class GChecker(BaseChecker): # gives a TypeError: Error when calling the metaclass bases
    # SOME METHODS WHICH USE URLLIB

最后是main.py文件:
import ?????
gChecker = GChecker()
gChecker.someStuff() # which uses urllib

我希望能够运行main.py文件并调用checker/目录下的类。但我想避免在每个文件中导入urllib(如果可能的话)。
请注意,__init__.py文件都是空文件。
我已经尝试在main.py中调用from checker.gChecker import GChecker,但会出现ImportError: No module named checker.gChecker的错误提示。

1
你是如何运行main.py的?Python需要知道在哪里找到“checker”模块,所以如果要执行“import checker.gChecker”,你需要将其放在你的PYTHONPATH中。 - bear
1个回答

2
在发布的代码中,在gChecker.py中,你需要执行
from baseChecker import BaseChecker

使用 import baseChecker 代替。否则会出现以下错误:

NameError: name 'BaseChecker' is not defined

另外,根据上述文件夹结构,在 main.py 中不需要将 checker 模块添加到 PYTHONPATH 中才能被 main.py 访问。

main.y 中可以这样写:

from checker import gChecker.GChecker

但这会让我在两个文件中都要import urllib,有没有一种方法只导入一次呢? - lpares12
python 中,每次使用一个模块时,你都需要添加相关的导入。这与你所遇到的错误无关。 - saloua
如果在baseChecker.py中有一些方法怎么办?只使用from baseChecker import BaseChecker导入类,如果我没记错的话,是吗? - lpares12
是的,它只导入了类。如果你想要在 baseChecker 中使用所有内容,你需要做 import baseChecker.* 然后你可以直接使用函数和类名。你也可以做 import basechecker 然后每当你使用 basechecker.py 中的一个函数,例如:func1,你需要做 basechecker.func_name 或者 basechecker.class_name,例如:basechecker.func1 或者在你当前的用例中 basechecker.BaseChecker - saloua
@lpares12 在main.py中编辑了答案的导入方式,如果有用,请点赞和/或接受,也帮助其他人找到正确的答案。 - saloua
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接