问题描述
└── auto/
│ ├──── __init__.py
│ └──── __pycache__/
│ ├──── deploy
│ ├──── destroy
│ └──── helpers/
│ │ ├──── __init__.py
│ │ ├──── cli.py
│ │ └──── zip.py
│ └──── synth
└── src/
│ ├──── __init__.py
│ ├──── main.py
│ └──── models/
│ │ ├──── __init__.py
│ │ ├──── filter.py
│ │ └──── json_extract_config.py
│ └──── utils/
│ │ ├──── __init__.py
│ │ └──── json_extractor.py
我正在尝试调用 ./auto/synth 位置中的脚本 synth
。
合成文件是一个脚本,顶部有一个shebang #!/usr/bin/env python3
它从 ./auto/helpers/zip.py 文件中导入一个函数。
当我运行时,根文件夹中的 ./auto/synth
会引发错误:
from auto.helpers.zip import zip_folder
ModuleNotFoundError: No module named 'auto'
虽然当我运行 PYTHONPATH="$PWD" ./auto/synth
时脚本成功执行。
有人可以帮助我理解这种行为以及如何避免这种行为,以便我的脚本可以正常运行而无需更改 PYTHOnopATH?
提前致谢。
解决方法
如果您使用的是 Python 3.3+ 版本,则不再需要使用 __init__.py 文件,因为命名空间现在已内置到模块中。链接 --> Is __init__.py not required for packages in Python 3.3+
我相信您必须将 {full path}/src 和 {full path}/auto 目录添加到 PYTHONPATH 以提供 python 脚本正确的路径,或者您可以使用 python sys 模块并在里面使用 sys.path您的模块为您要导入的模块设置路径链接 --> https://docs.python.org/3/tutorial/modules.html#the-module-search-path
import sys
# example path could be "C:/Users/Bob/Desktop/project/auto"
sys.path.append("{full path to your auto directory}/auto")