Python 从子目录和在子目录内导入时,如何解决冲突的导入要求?

Python 从子目录和在子目录内导入时,如何解决冲突的导入要求?,python,spyder,Python,Spyder,我有一个具有以下结构的项目: ./script.py ./modules/__init__.py ./modules/mod1.py ./modules/mod2.py 我需要在mod1.py中导入mod2,在script.py中导入mod1和mod2。为了便于测试,我有时还希望将mod1.py文件作为脚本运行(使用if\uuuuuu name\uuuuuu==“\uuuuuu main”:)。然而,我注意到以下几点: 在script.py中,我包括来自modules import mod1

我有一个具有以下结构的项目:

./script.py
./modules/__init__.py
./modules/mod1.py
./modules/mod2.py
我需要在
mod1.py
中导入
mod2
,在
script.py
中导入
mod1
mod2
。为了便于测试,我有时还希望将
mod1.py
文件作为脚本运行(使用
if\uuuuuu name\uuuuuu==“\uuuuuu main”:
)。然而,我注意到以下几点:

  • script.py
    中,我包括来自modules import mod1的
    和来自modules import mod2的
  • 如果我在
    mod1.py
    中包含
    import mod2
    ,我可以运行
    mod1.py
  • …但是如果我尝试运行
    script.py
    ,我会得到
    ModuleNotFoundError:没有名为'mod2'的模块
    。我可以修改
    mod1.py
    ,改为使用模块导入mod2的
    ,然后运行
    script.py
  • 。。。但是如果我尝试只运行
    mod1.py
    ,我会得到
    ModuleNotFoundError:没有名为“modules”的模块
我在这个网站上搜索了一下,发现了几个问题,只涉及在一个目录中导入和从一个子目录导入,但没有找到任何关于解决两者之间冲突的要求的问题。我错过了什么

编辑:我正在通过Spyder的IPython控制台运行我的所有项目,因此使用此工作流的解决方案将非常有用。

使用绝对导入:

from modules import mod1
from modules import mod2
并使用以下命令从根目录运行所有内容:


@Piotr Praszmo的答案有效。根据这个答案,我发现对于在Spyder中运行脚本的特定情况,在任何地方使用绝对导入,然后将
runfile
命令中的工作目录更改为根目录,解决了我的问题:

runfile('./modules/mod1.py', wdir='./')

当我尝试使用您建议的代码运行
mod1.py
时,我没有问题…@user32882我正在通过Spyder运行我的所有脚本-这可能会有所不同。澄清一下,这意味着模块可以/不应该作为来自其子目录的脚本运行?是的,这仅适用于根目录中的模块(即:
pythonscript.py
)。包中的子模块不应以这种方式执行。
runfile('./modules/mod1.py', wdir='./')