我的项目有这样的布局:
projectFolder /
setup/
__init__.py
setup.py
Utils /
__init__.py
cloudmanager.py
startup.py
我正在尝试将setup
模块导入我的CloudManager.py
脚本(嵌套在另一个目录中)中。 我可以很容易地将setup
模块和utils
模块导入到我的startup.py
脚本中,因为它位于根目录中。
我已经尝试(在我的CloudManager.py
脚本中):
from . import setup
这给出了以下错误:
ImportError: cannot import name 'setup' from partially initialized module 'Utils' (most likely due to a circular import)
我试过:
from .. import setup
这给出了以下错误:
ValueError: attempted relative import beyond top-level package
有人帮忙吗? 有这样的问题,但他们转向使用操作系统,这是我想避免的。。。
尝试使用:
import setup.setup
好吧,所以您在导入时出现错误的原因是。。。 setup
确实是,当父目录是包时,您不能执行相对导入。 包是包含__init__.py
文件的任何目录。
您可以通过以下两种方法之一来解决这个问题:
如果ProjectFolder
文件夹位于/home/you/project/projectFolder
,请确保PythonPath
中有/home/you/project/projectFolder
。 例如,当您运行主脚本时,您可以预先设置它。 在bash中(假设是Unix环境):
export PYTHONPATH=/home/you/projects/projectFolder
python /home/you/projects/projectFolder/startup.py
如果您想避免更改外部环境,也可以在startup.py内部这样做:
# startup.py
import os, sys
sys.path.append(os.path.join(os.path.dirname(__file__)))
如果在startup.py中这样做,startup.py的目录将始终位于Python路径中。
一旦你成为其中之一,你就可以基于你的项目的相对位置你的所有导入。 例如:
import setup.setup
import Utils.cloudmanager
(在sys.path
变异运行后,这将在导入的每个文件中起作用)
如果您将项目的根设置为Python包,则可以完全使用相对导入。 例如,您将拥有以下文件:
projectFolder/__init__.py
projectFOlder/setup/__init__.py
projectFolder/setup/setup.py
projectFolder/Utils/__init__.py
projectFolder/Utils/cloudmanager.py
如果您这样做,在CloudManager.py
内部,您可以从。。运行。 导入setup
就可以了。
这两个选项都是有效的。 一般来说,相对导入具有较少的二义性,因为它们避免了名称冲突,但它们是Python的一个较新的特性,因此选项#1通常更常见。