构建没有路径入侵的python项目

Drx*_*xxd 9 python directory-structure project-structure organization python-import

我有一个共享的python库,我在多个项目中使用,所以结构如下所示:

Project1
    main.py <--- (One of the projects that uses the library)
...
sharedlib
    __init__.py
    ps_lib.py
    another.py
Run Code Online (Sandbox Code Playgroud)

现在在每个项目的main.py中,我使用以下hack来使它工作:

import os
import sys
sys.path.insert(0, os.path.abspath('..'))

import sharedlib.ps_lib
...
Run Code Online (Sandbox Code Playgroud)

有没有办法在不使用这个黑客的情况下做到这一点?或者有更好的方法来组织项目结构吗?

MSe*_*ert 6

我认为最好的方法是制作sharedlib一个真正的包。这意味着稍微改变一下结构:

\n
sharedlib/\n    sharedlib/\n        __init__.py\n        ps_lib.py\n        another.py\n    setup.py\n
Run Code Online (Sandbox Code Playgroud)\n

setup.py并在(部分取自Python包装“最小结构” )中使用类似的东西:

\n
from setuptools import setup\n\nsetup(name=\'sharedlib\',\n      version=\'0.1\',\n      description=\'...\',\n      license=\'...\',\n      packages=[\'sharedlib\'],   # you might need to change this if you have subfolders.\n      zip_safe=False)\n
Run Code Online (Sandbox Code Playgroud)\n

然后使用python setup.py developpip install -e .在包的根文件夹中安装它sharedlib

\n

这样(使用develop-e选项)对文件内容的更改sharedlib/sharedlib/*将是可见的,而无需重新安装软件包sharedlib- 尽管如果您正在交互式解释器中工作,则可能需要重新启动解释器。那是因为解释器缓存了已经导入的包。

\n

setuptools文档中:

\n
\n

setuptools 允许您部署项目以在公共目录或暂存区域中使用,但无需复制任何文件。因此,您可以在其签出目录中编辑每个project\xe2\x80\x99s代码,并且只需要在更改project\xe2\x80\x99s C扩展或类似编译文件时运行构建命令。[...]

\n

为此,请使用该setup.py develop命令。

\n
\n

(强调我的)

\n

最重要的是,您import sharedlib现在可以在任何地方 - 不再需要将包插入或sharedlib中,因为 Python(或至少是您安装它的 Python)现在像任何其他已安装的包一样对待。PATHPYTHONPATHsharedlib

\n