Git hat eine spezielle Funktion: Wenn Sie ein Skript namens "git-xxx" (** mit Ausführungsberechtigung und unter Ihrem PATH **) haben, können Sie es in der Form ** git xxx ** ausführen. (Der berühmte "Git-Flow" verwendet diese Funktion auch, um "Git-Flow" zu nennen.)
Lassen Sie uns diese Funktion in Python neu erfinden.
mygit.py
# coding: utf-8
import os
import sys
from subprocess import call
class ExtensionLoader:
def __init__(self):
#Da die Umgebungsvariable PATH eine Zeichenfolge ist, die durch einen Doppelpunkt verbunden ist,
#Konvertieren Sie in ein Array, indem Sie mit einem Doppelpunkt teilen
self.PATH = os.environ["PATH"].split(":")
def load(self, ext, args):
# ext: 'mygit init' -> 'init'
ext_absname = "mygit-{}".format(ext)
found_flag = None
extension = None
for directory in self.PATH:
# 'mygit-init'Ist im Verzeichnis
if ext_absname in os.listdir(directory):
found_flag = True
extension = os.path.join(directory, ext_absname)
if found_flag:
# 'mygit-init'Laufen Sie, wenn Sie finden
cmd = [extension]
cmd += args #Übergabe von Argumenten an das hier auszuführende Erweiterungsskript
return call(cmd)
else:
raise IOError("Extension does not found: {}".format(ext))
if __name__ == "__main__":
if len(sys.argv) == 1:
print "usage: mygit {command}"
sys.exit(1)
extloader = ExtensionLoader()
# argv: ["mygit" "command", "arg1", "arg2", "arg3"]
command = sys.argv[1]
arguments = sys.argv[2:]
exit_status = extloader.load(command, arguments)
sys.exit(exit_status)
Es war überraschend einfach.
Das Problem ist, dass es nicht mit ** argparse ** verwendet werden kann. argparse kann Unterbefehle analysieren, aber wenn ein nicht registrierter Befehl eingegeben wird, wird ein Fehler ausgegeben und es ist nicht möglich, den Erweiterungsskriptbefehl im Voraus zu registrieren ...
Recommended Posts