【问题标题】:Install python repository without parent directory structure安装没有父目录结构的python存储库
【发布时间】:2016-04-25 17:46:18
【问题描述】:

我有一个我继承的存储库,很多团队都在使用它,很多脚本都调用它,而且对它进行任何结构更改似乎真的很让人头疼。我想让这个 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 的结构很有趣,这样我就可以安装它了?

【问题讨论】:

    标签: python git installation setup.py


    【解决方案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 中运行,并且进行测试以确保命名空间不会混乱

    【讨论】:

    • 谢谢!所以说我在这个存储库之外,这将允许我做类似from my_repo import scripts; scripts.func1(); 的事情?
    • 不,python 将不知道 my_repo 命名空间。你必须这样做import scripts; scripts.func1();
    • 这可以在my_repo/之外完成吗?还是我需要与 scripts.py 位于同一目录中?
    【解决方案2】:

    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”或“pip install”命令安装 my_repo 的内容。最终会得到 my_repo 模块的安装副本。

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

        from my_repo import scripts
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-15
      • 1970-01-01
      • 1970-01-01
      • 2012-01-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多