Python 3.x 什么时候应该在子流程上使用Python git

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

我试图说服我的同事,使用子流程来获取回购头是不好的,因为生成子流程或创建流程有很多开销。为了说服他,我创建了两个脚本并对它们进行了分析,但结果并不是我所期望的(pythongit将比subprocess更快)

这是我分析的第一个脚本-
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数据转换和处理是该语言的核心优势

作为对位;实际上我更喜欢使用SQL查询。例如它们允许您考虑在查询或Python中最好完成哪种数据转换,作为对位;实际上我更喜欢使用SQL查询。例如它们允许您考虑在查询或Python中最好完成哪些数据转换。