【问题标题】:Where to Put Python Utils Folder?将 Python Utils 文件夹放在哪里?
【发布时间】:2011-03-08 07:51:52
【问题描述】:

我有一大堆这样组织的脚本:

root
  group1
    script1.py
    script2.py
  group2
    script1.py
    script2.py
  group3
    script1.py
    script2.py
  utils
    utils1.py
    utils2.py

所有脚本*.py 都使用 utils 文件夹中的函数。目前,我将 utils 路径附加到脚本以导入 utils。

但是,这似乎是不好的做法(或“不是 Pythonic”)。此外,实际上的组并不像这样平坦,而且 util 文件夹比上面列出的要多。因此,追加路径解决方案变得越来越混乱。

我怎样才能以不同的方式组织它?

【问题讨论】:

    标签: python code-organization


    【解决方案1】:

    首先使所有目录都可导入,即使用__init__.py。 然后有一个顶级脚本,它接受参数并基于它调用脚本。

    从长远来看,Keith 提到的 distutils 是正确的。否则,这是一个更简单(肯定不是最好的)解决方案。

    组织

    runscript.py
    group1
        __init__.py
        script1.py
    utils
        __init__.py
        utils1.py
    

    调用

    python runscript -g grp1 -s script1
    

    runscript.py

    import utils
    
    def main():
        script_to_exec = process_args()
        import script_to_exec as script # __import__
        script.main()
    
    main()
    

    也许你的脚本可以有 main 函数,然后由 runscript 调用。 我建议您在顶层有一个脚本来导入脚本。

    【讨论】:

      【解决方案2】:

      您需要使用包。当一个目录中有一个名为__init__.py 的文件时,Python 将其识别为一个包。最好还是使用distutils 来制作一个源包,它也会为你安装它。几乎永远不要修改 sys.path,安装包会将其放置在标准位置(站点包),因此您不必修改它。

      【讨论】:

        【解决方案3】:

        您可能还对以下内容感兴趣: Python 3: Good location(s) to install own and 3rd party packages?

        是的,我可以看到软件包是如何提供帮助的,但是如果您仍在使用 utils 并在使用 group1、group2 等时更改它们,那么进行安装会产生很多开销。

        仍在寻找这个问题的好答案。

        【讨论】:

          【解决方案4】:

          我们无法从人为设计的示例中真正知道您的用例是什么。我建议制作一个包含您的 utils 模块和其他脚本的包,然后使用来自脚本的相对导入,例如 from ..utils import utils1。当然,您不会将顶级包称为“root”,而是选择一个类似于您的项目名称的名称。

          如果你真的有很多这样的脚本,那么有一个单独的运行脚本然后根据 cmdline 参数导入模块可能是有意义的。然后像runner.py <somecommand> 这样的东西会导入并执行<top package>.commands.somecommand.runFunction(例如,Django 会这样做——使项目可扩展)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-04-12
            • 2016-05-24
            • 2011-11-25
            • 1970-01-01
            • 1970-01-01
            • 2013-05-04
            • 1970-01-01
            相关资源
            最近更新 更多