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

时间:2017-08-16 10:01:29

标签: python python-import directory-structure organization project-structure

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

Project1
    main.py <--- (One of the projects that uses the library)
...
sharedlib
    __init__.py
    ps_lib.py
    another.py

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

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

import sharedlib.ps_lib
...

有没有办法在不使用此黑客的情况下执行此操作?或者有更好的方法来组织项目结构吗?

3 个答案:

答案 0 :(得分:2)

我认为最好的方法是让sharedlib成为一个真正的包。这意味着改变结构:

sharedlib/
    sharedlib/
        __init__.py
        ps_lib.py
        another.py
    setup.py

setup.py中使用此类内容(部分来自Python-packaging "Minimal Structure"):

from setuptools import setup

setup(name='sharedlib',
      version='0.1',
      description='...',
      license='...',
      packages=['sharedlib'],   # you might need to change this if you have subfolders.
      zip_safe=False)

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

这样(使用develop-e选项)对sharedlib/sharedlib/*文件内容的更改将在不重新安装sharedlib包的情况下显示 - 尽管您可以如果您正在使用交互式解释器,则需要重新启动解释器。这是因为解释器缓存了已经导入的包。

来自setuptools文档:

  

Setuptools允许您部署项目以在公共目录或临时区域中使用,但不复制任何文件。 因此,您可以在其checkout目录中编辑每个项目的代码,只需在更改项目的C扩展或类似编译的文件时运行构建命令。 [...]

     

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

(强调我的)

最重要的是,您现在可以import sharedlib到处 - 不再需要在sharedlibPATH中插入PYTHONPATH包,因为Python(或至少你安装它的Python)现在像任何其他已安装的软件包一样对待sharedlib

答案 1 :(得分:0)

post描述了组织项目的好方法。 在我看来,如果是共享库,你必须考虑将它用作真正的库(包含在virtualenv中)或添加文件夹&#34; lib&#34;每个项目。

答案 2 :(得分:0)

我们这样做的方法是为python脚本使用bash entry-scripts。我们的目录结构类似于以下内容:

var be = Country.GetBindingExpression(XamComboEditor.ItemsSourceProperty);
if (be != null && be.ParentBinding != null)
...

然后我们的lib文件夹包含所有子项目

/opt/stackoverflow/
                 -> bin
                 -> conf
                 -> lib
                 -> log

然后当我们想要执行python脚本时,我们将通过bin目录中的bash脚本执行它

/opt/stackoverflow/lib/
                    -> python_algorithms
                    -> python_data_structures
                    -> python_shared_libraries

如果我们使用其中一个入口脚本

/opt/stackoverflow/bin/
                    -> quick_sort.sh
                    -> merge_sort.sh