绝对导入在 Python 3.7 中不起作用
Absolute import doesn't work in Python 3.7
我有一个这样设置的目录
Project
|
|folder1
| |folder2
| | |Script_A.py
|
|folder3
| |Script_B.py
我正在尝试从 [=22= 访问位于 Script_B.py 的名为 ClassB ]Script_A.py 在 Python 3.7。我正在尝试使用绝对导入来实现这一点。这是Script_A.py的内容:
from folder3.Script_B import ClassB
我好像漏掉了什么。我不明白 Script_A 应该如何知道 Script_B 甚至文件夹的存在folder3 甚至 Project。什么告诉 python 查找这些文件夹?
我已阅读 PEP328 但这并没有回答我的任何问题。
我会使用 __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 有一个 class 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
更好的主意
运行 你的脚本与 PYTHONPATH
PYTHONPATH="$PWD/path_to_package" python code.py
我有一个这样设置的目录
Project
|
|folder1
| |folder2
| | |Script_A.py
|
|folder3
| |Script_B.py
我正在尝试从 [=22= 访问位于 Script_B.py 的名为 ClassB ]Script_A.py 在 Python 3.7。我正在尝试使用绝对导入来实现这一点。这是Script_A.py的内容:
from folder3.Script_B import ClassB
我好像漏掉了什么。我不明白 Script_A 应该如何知道 Script_B 甚至文件夹的存在folder3 甚至 Project。什么告诉 python 查找这些文件夹?
我已阅读 PEP328 但这并没有回答我的任何问题。
我会使用 __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 有一个 class 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
更好的主意
运行 你的脚本与 PYTHONPATH
PYTHONPATH="$PWD/path_to_package" python code.py