Python 通过终端在深层子目录中执行脚本会分解我的导入

Python 通过终端在深层子目录中执行脚本会分解我的导入,python,path,relative-path,Python,Path,Relative Path,我的文件结构如下: project/ __init__.py common/ __init__.py util.py utilhelper.py stuff/ __init__.py coolstuff/ __init__.py awesome.py 公共/初始化.py 公共/util.py stuff/coolstuff/awesome.py

我的文件结构如下:

project/
    __init__.py
    common/
        __init__.py
        util.py
        utilhelper.py
    stuff/
        __init__.py
        coolstuff/
            __init__.py
            awesome.py
公共/初始化.py 公共/util.py stuff/coolstuff/awesome.py 当我这样做时:

python项目/stuff/coolstuff/awesome.py

“从公共导入util”失败,并显示“没有名为公共的模块”

我意识到我遗漏了一些非常重要的心理概念,比如路径和包装,因为我不知道如何解决这个问题。但如果可能的话,我希望在深层子目录中保留类似“fromcommonimportutil”的代码

我考虑过: -设置铺装器以将路径依赖项注入到通过sh运行python脚本的任务中:

@task
@needs(['common'])
def dostuff():
    sh('python stuff/coolstuff/awesome.py')
不幸的是,我不知道我在做什么,也找不到关于这方面的好例子/教程

-使用imp在100%的脚本中显式导入相对和/或绝对文件路径

-在每个python文件的顶部编写小的hacky路径插入

我非常感谢您的建议。

作为一个快速解决方案,我:

  • 已将公用目录移动到stuff/
  • 在awome.py“from..common import util”中使用了相对导入
  • 在taskrunner文件中使用sh显式硬编码-m(模块模式)python脚本启动器

查看并阅读相关导入。作为更好的修复方法,我将项目目录添加到了PYTHONPATH中。它需要更少的代码来实现,代价是必须在运行代码的每台机器上设置环境变量
import utilhelper
help = utilhelper.help()
from common import util
print util.help
@task
@needs(['common'])
def dostuff():
    sh('python stuff/coolstuff/awesome.py')