Python 3.x 什么时候应该在子流程上使用Python git
我试图说服我的同事,使用子流程来获取回购头是不好的,因为生成子流程或创建流程有很多开销。为了说服他,我创建了两个脚本并对它们进行了分析,但结果并不是我所期望的(pythongit将比subprocess更快) 这是我分析的第一个脚本-Python 3.x 什么时候应该在子流程上使用Python git,python-3.x,subprocess,Python 3.x,Subprocess,我试图说服我的同事,使用子流程来获取回购头是不好的,因为生成子流程或创建流程有很多开销。为了说服他,我创建了两个脚本并对它们进行了分析,但结果并不是我所期望的(pythongit将比subprocess更快) 这是我分析的第一个脚本-test\u git\u module.py import git def test(): repo = git.Repo(".", search_parent_directories=True) test() 在使用cProfile-python
test\u git\u module.py
import git
def test():
repo = git.Repo(".", search_parent_directories=True)
test()
在使用cProfile-python3-m cProfile test\u git\u module-s对其进行评测后,我得到的输出是在0.130秒内进行的78059次函数调用(75806次基本调用)
另一方面,当我分析脚本test_subprocess.py时,输出是
0.017秒内完成6529个函数调用(6430个基本调用)
test_subprocess.py
import subprocess
import os
import sys
def test():
SELF_DIRPATH = os.path.dirname(__file__)
WORKSPACE_DIRPATH = (
subprocess.run(["git", "rev-parse", "--show-toplevel"], stdout=subprocess.PIPE, check=True)
.stdout.decode(sys.stdout.encoding)
.strip()
)
test()
因此,很明显,在这个python中,git一点帮助都没有,而且它执行此类任务的速度非常慢。这就引出了一个问题:何时以及为什么要在子流程上使用Python GIT 没有为执行速度创建git模块。调用shell命令并解析输出会使代码不可读,难以维护,有时可能会很棘手。调用python函数而不是
subprocess.run
通常更优雅、可读和方便
git rev parse——show toplevel
是一个简单的解析输出。git日志怎么样?我并不是说这是不可能的,但是95%的代码都是关于调用shell和解析输出的,而不是关于逻辑的。显然,您可以为需要的每个命令创建一个函数,但这正是git
模块已经具备的功能
这就像ORM和裸SQL查询一样。大多数开发人员为了方便而喜欢ORM。
git
模块不是为了提高执行速度而创建的。调用shell命令并解析输出会使代码不可读,难以维护,有时可能会很棘手。调用python函数而不是subprocess.run
通常更优雅、可读和方便
git rev parse——show toplevel
是一个简单的解析输出。git日志怎么样?我并不是说这是不可能的,但是95%的代码都是关于调用shell和解析输出的,而不是关于逻辑的。显然,您可以为需要的每个命令创建一个函数,但这正是git
模块已经具备的功能
这就像ORM和裸SQL查询一样。大多数开发人员更喜欢ORM以方便使用。使用
子流程
具有明显的优势
模块是标准库的一部分子流程
- 这是一种你会经常遇到的模式;不是每个程序都有Python模块
- 在现代(尤其是类UNIX)系统上,创建进程既快速又便宜
git log
可以轻松解析输出
git log --pretty=format:"%h%x09%an%x09%ad%x09%s"
(来自)
这会将每个提交生成为一行,字段由制表符分隔;非常容易转换
import subprocess as sp
args = ['git', 'log', '--pretty=format:%h%x09%an%x09%ad%x09%s']
commits = [ln.split('\t') for ln in sp.check_output(args, text=True).splitlines()]
当然,还有其他程序处理输出比较困难。但是,
- 文本是一个通用接口李>
- 这是Python数据转换和处理是该语言的核心优势
子流程
具有明显的优势
模块是标准库的一部分子流程
- 这是一种你会经常遇到的模式;不是每个程序都有Python模块
- 在现代(尤其是类UNIX)系统上,创建进程既快速又便宜
git log
可以轻松解析输出
git log --pretty=format:"%h%x09%an%x09%ad%x09%s"
(来自)
这会将每个提交生成为一行,字段由制表符分隔;非常容易转换
import subprocess as sp
args = ['git', 'log', '--pretty=format:%h%x09%an%x09%ad%x09%s']
commits = [ln.split('\t') for ln in sp.check_output(args, text=True).splitlines()]
当然,还有其他程序处理输出比较困难。但是,
- 文本是一个通用接口李>
- 这是Python数据转换和处理是该语言的核心优势