在哪里放置Python Utils文件夹?

时间:2011-03-08 07:51:53

标签: 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”)。此外,实际上这些组并不像这样平坦,并且有比上面列出的更多的util文件夹。因此,附加路径解决方案变得更加混乱和混乱。

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

4 个答案:

答案 0 :(得分:3)

首先使所有目录都可导入,即使用__init__.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()

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

答案 1 :(得分:1)

您可能也有兴趣: Python 3: Good location(s) to install own and 3rd party packages?

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

仍然在寻找好的答案。

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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