Python 如何正确导入&x27;图书馆';包裹

Python 如何正确导入&x27;图书馆';包裹,python,python-import,Python,Python Import,在我们公司,我们在各种项目中使用python。我希望我们的代码更加清晰易读,并且已经修改了一些要遵循的内容。我们在多个项目使用的“库”包中有一些在这些项目之间共享的通用模块。以下是基本层次结构: src_py\ lib\ sharedmodule1.py ... ProjectA\ ... ProjectB\ ... ProjectC\ helper\ help

在我们公司,我们在各种项目中使用python。我希望我们的代码更加清晰易读,并且已经修改了一些要遵循的内容。我们在多个项目使用的“库”包中有一些在这些项目之间共享的通用模块。以下是基本层次结构:

src_py\
    lib\
        sharedmodule1.py
        ...
    ProjectA\
        ...
    ProjectB\
        ...
    ProjectC\
        helper\
            helpermodule1.py
            ...
        converter\
            base.py
            ...
        runprojectc.py
我正在处理ProjectC,我想在base.py和runprojectc.py中导入sharedmodule1.py。最好的方法是什么。相对进口?绝对进口?重新构建我们的项目结构

现在我觉得导入lib包的最佳(最具python风格)方法是使用相对导入,但从我的阅读资料来看,这是非常不鼓励的()。我经常在类似问题上看到的解决方案是使用绝对导入并修改sys.path以包含父目录(这就是我们现在正在做的)。我要说的是。。。“一定有更好的办法”

目前我们的进口产品是这样的(非常难看和混乱):

或者我们可以做(清洁):

或亲属:

# runprojectc.py
from .lib import sharedmodule1.py

我想要一些干净且“社区可接受”的东西。我想听听一些想法!

你可以带上你的库包和('site-pacakes')。然后它就是
导入lib
(当然,你可能希望使用一个不那么模棱两可的名称)。您可能应该遵循python打包约定,并创建一个
setup.py
来完成繁重的工作(对于库和需要它的东西),请看,我非常喜欢将其放在站点包中,并可能通过设置来实现。但由于这是供内部使用的,我不确定我们是否需要管理在某些机器上运行的版本。我们主要直接从SCM框架运行,我们关心的实际共享模块依赖于SWIG生成的code(来自我们的C/C++代码库),因此这意味着不断更新pyd文件。我将考虑这一点,以及我们如何改变我们运行项目和使用设置的方式,而不是直接从SCM运行。不过,我怀疑我的老板会喜欢它。我以前使用过
sys.path.insert
技巧,用于完全相同的情况(代码从SCM系统中签出并运行,无需单独的“安装”步骤)。我最喜欢(或至少最讨厌)的版本是您的第二个版本:插入
“…”
,并从库导入中使用
# runprojectc.py
sys.path.insert(0, '..')
from lib import sharedmodule1.py
# runprojectc.py
from .lib import sharedmodule1.py