在哪里放置Python Utils文件夹?

在哪里放置Python Utils文件夹?,python,code-organization,Python,Code Organization,我有一大堆这样组织的脚本: 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

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

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文件夹。因此,附加路径解决方案变得越来越混乱


我如何以不同的方式组织它?

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

您可能还对以下方面感兴趣:

是的,我可以看出软件包是如何起到帮助作用的,但是如果您仍在处理UTIL,并且在处理group1、group2等时对其进行更改,则进行安装会带来很大的开销


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

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

从长远来看,基思所提到的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()
也许您的脚本可以有主函数,然后由runscript调用。
我建议您在顶层创建一个脚本,用于导入脚本

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

如果您确实有很多这样的脚本,那么使用一个运行脚本,然后根据cmdline参数导入模块可能是有意义的。类似于
runner.py
的东西随后将导入并执行
.commands.somecommand.runFunction
(例如,Django这样做-使项目可扩展)