Python工具文件夹放在哪里?
我有一堆脚本,组织得像这样:
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 个回答
你需要使用包。Python会把一个文件夹当作包来识别,前提是这个文件夹里有一个叫做 __init__.py
的文件。更好的办法是使用 distutils 来创建一个源包,这样它会帮你安装。一般来说,不应该随便修改sys.path,而安装包时,它会放在一个标准的位置(site-packages),这样你就不需要去修改它了。
从你给的例子中,我们其实很难了解你的具体需求。我建议你可以把你的工具模块和其他脚本放在一个包里,然后在脚本中使用相对导入,比如用 from ..utils import utils1
这样的方式。当然,你不会把最上层的包命名为“root”,而是应该用你项目的名字来命名。
如果你有很多这样的脚本,可能可以考虑写一个统一的运行脚本,根据命令行参数来导入模块。比如可以用 runner.py <somecommand>
这样的方式,然后它会导入并执行 <top package>.commands.somecommand.runFunction
(比如Django就是这样做的,让项目更灵活可扩展)。
首先,让你的所有文件夹都可以被导入,也就是说要使用 __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 来调用。我建议你在顶层放一个脚本,它可以导入这个脚本。