安装没有父目录结构的python存储库

时间:2016-04-25 17:46:19

标签: python git install setup.py

我有一个我继承的存储库,很多团队都使用它,很多脚本都会调用它,而且对它进行任何结构性修改似乎都是一件非常令人头痛的问题。我想以某种方式安装这个repo。它的结构如下:

my_repo/
    scripts.py

如果是我的存储库,我会像这样更改结构并使其可安装,并运行python setup.py install

my_repo/
    setup.py
    my_repo/
        __init__.py
        scripts.py

如果这不可行(听起来可能不是这样),我可以做某事:

my_repo/
    setup.py
    __init__.py
    scripts.py

并在setup.py中添加一些内容,让它知道repo结构有趣,这样我可以安装它吗?

2 个答案:

答案 0 :(得分:1)

你可以做你的建议。

my_repo/
    setup.py
    __init__.py
    scripts.py

唯一的事情是,如果它们位于基础级别,您将需要通过其名称导入包中的模块。例如,如果你的结构看起来像这样:

my_repo/
    setup.py
    __init__.py
    scripts.py
    lib.py
    pkg/
        __init__.py
        pkgmodule.py

然后您在scripts.py中的导入可能看起来像

from lib import func1, func2
from pkg.pkgmodule import stuff1, stuff2

因此,在您的基本目录中,导入主要是按模块名称而不是按包。如果你不小心,这可能会搞砸你的其他一些软件包名称空间,比如是否存在另一个名为lib的软件包的依赖项。因此,最好是让这些脚本在virtualenv中运行,如果你进行测试以确保命名空间不会搞砸

答案 1 :(得分:1)

setup.py文件中有一个指令,用于设置要安装的软件包的名称,以及从哪里获取要安装的模块。这将允许您使用所需的目录结构。例如,使用给定的目录结构:

     my_repo/
       setup.py
       __init__.py
       scripts.py

您可以编写一个setup.py,例如:

        setup(
        # -- Package structure ----
        packages=['my_repo'],
        package_dir={'my_repo': '.'})

因此,使用命令" ./ setup.py install"安装my_repo内容的任何人或者" pip install。"最终将安装my_repo模块的安装副本。

作为旁注;相对导入在python 2和python 3中的工作方式不同。在后者中,任何相对导入都需要明确指定这样做的意愿。当以绝对导入方式调用时,这种安装my_repo的方法将在python 3中起作用:

    from my_repo import scripts