绝对导入在Python 3.7中不起作用

时间:2019-07-04 14:43:48

标签: python python-3.x python-import

我有一个这样的目录

Project
   |
   |folder1
   |  |folder2
   |  |  |Script_A.py
   |
   |folder3
   |  |Script_B.py

我正在尝试从Python 3.7中的 Script_A.py 访问位于 Script_B.py 中的名为 ClassB 的类。我正在尝试使用绝对导入来实现这一点。这是Script_A.py的内容:

from folder3.Script_B import ClassB

似乎有些我想念的东西。我不知道 Script_A 应该如何知道 Script_B 甚至文件夹 folder3 甚至的存在。项目。是什么告诉python查找这些文件夹?

我已经读过PEP328,但这并不能回答我的任何问题。

1 个答案:

答案 0 :(得分:2)

我将使用__init__.py(只是一个空文件)将文件夹转换为模块:

package/
    __init__.py
    subpackage1/
        __init__.py
        moduleX.py
        moduleY.py
    subpackage2/
        __init__.py
        moduleZ.py
        subpackage2_1/
              __init___.py
              deep_module.py
module_test.py

这将允许(在module_test.py中)

from package.subpackage2.subpackage2_1 import deep_module

如果deep_module具有Foo类

# deep_module.py
class Foo: pass

我们可以将Foo导入为

from package.subpackage2.subpackage2_1.deep_module import Foo

我不建议您使用此类导入,因为它们很难调试。

您可以这样做:

from package.subpackage2.subpackage2_1 import deep_module

# it helps to know where class is coming from
foo = deep_module.Foo()

比直接导入Foo更好,但是出于可读性考虑,我仍然会尽量避免使用它;)

如果在软件包目录中进行呼叫,则

from subpackage2.subpackage2_1 import deep_module

或者,这将随处可见

# terrible hack is to add your package to your sys path
import sys
sys.path.insert(0,'path_to_package')

from package.subpackage2.subpackage2_1 import deep_module