Python工具文件夹放在哪里?

6 投票
4 回答
16817 浏览
提问于 2025-04-16 13:14

我有一堆脚本,组织得像这样:

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 个回答

1

你需要使用包。Python会把一个文件夹当作包来识别,前提是这个文件夹里有一个叫做 __init__.py 的文件。更好的办法是使用 distutils 来创建一个源包,这样它会帮你安装。一般来说,不应该随便修改sys.path,而安装包时,它会放在一个标准的位置(site-packages),这样你就不需要去修改它了。

1

从你给的例子中,我们其实很难了解你的具体需求。我建议你可以把你的工具模块和其他脚本放在一个包里,然后在脚本中使用相对导入,比如用 from ..utils import utils1 这样的方式。当然,你不会把最上层的包命名为“root”,而是应该用你项目的名字来命名。

如果你有很多这样的脚本,可能可以考虑写一个统一的运行脚本,根据命令行参数来导入模块。比如可以用 runner.py <somecommand> 这样的方式,然后它会导入并执行 <top package>.commands.somecommand.runFunction(比如Django就是这样做的,让项目更灵活可扩展)。

5

首先,让你的所有文件夹都可以被导入,也就是说要使用 __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()

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

撰写回答