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)
有没有办法在不使用这个黑客的情况下做到这一点?或者有更好的方法来组织项目结构吗?
我认为最好的方法是制作sharedlib一个真正的包。这意味着稍微改变一下结构:
sharedlib/\n sharedlib/\n __init__.py\n ps_lib.py\n another.py\n setup.py\nRun Code Online (Sandbox Code Playgroud)\nsetup.py并在(部分取自Python包装“最小结构” )中使用类似的东西:
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)\nRun Code Online (Sandbox Code Playgroud)\n然后使用python setup.py develop或pip install -e .在包的根文件夹中安装它sharedlib。
这样(使用develop或-e选项)对文件内容的更改sharedlib/sharedlib/*将是可见的,而无需重新安装软件包sharedlib- 尽管如果您正在交互式解释器中工作,则可能需要重新启动解释器。那是因为解释器缓存了已经导入的包。
从setuptools文档中:
\n\nsetuptools 允许您部署项目以在公共目录或暂存区域中使用,但无需复制任何文件。因此,您可以在其签出目录中编辑每个project\xe2\x80\x99s代码,并且只需要在更改project\xe2\x80\x99s C扩展或类似编译文件时运行构建命令。[...]
\n为此,请使用该
\nsetup.py develop命令。
(强调我的)
\n最重要的是,您import sharedlib现在可以在任何地方 - 不再需要将包插入或sharedlib中,因为 Python(或至少是您安装它的 Python)现在像任何其他已安装的包一样对待。PATHPYTHONPATHsharedlib