Het subproces.methode uitvoeren:
Het subproces.run methode heeft een lijst met argumenten nodig. Wanneer de methode wordt aangeroepen, voert deze de opdracht uit en wacht tot het proces is voltooid, waarbij uiteindelijk een object "CompletedProcess" wordt geretourneerd. Het object "CompletedProcess" retourneert stdout, stderr, originele argumenten die zijn gebruikt tijdens het aanroepen van de methode en een retourcode. Stdout verwijst naar de gegevensstroom die door de opdracht wordt geproduceerd, terwijl stderr verwijst naar eventuele fouten die tijdens de uitvoering van het programma optreden. Elke retourcode die niet nul is (exitcode) zou een fout betekenen met de opdracht die in het subproces wordt uitgevoerd.methode uitvoeren:.
Voorbeeld 1: Inhoud van een tekstbestand uitvoeren met behulp van het subproces.methode uitvoeren:
De onderstaande opdracht zal de inhoud van een "data".txt” bestand, ervan uitgaande dat het een “name=John” string bevat.
subproces importerensubproces.run(["kat", "gegevens.tekst"])
Als u de bovenstaande code uitvoert, wordt de volgende uitvoer geretourneerd:
naam=JohnCompletedProcess(args=['cat', 'data.txt'], retourcode=0)
Het eerste element van het lijstargument is de naam van het uit te voeren commando. Elk element in de lijst dat volgt op het eerste element wordt beschouwd als opdrachtregelopties of schakelopties. U kunt ook enkele streepjes en dubbele streepjes gebruiken om de opties te definiëren. Als u bijvoorbeeld bestanden en mappen in een map wilt weergeven, zou de code "subprocess" zijn.run([“ls”, “-l”]”. In de meeste van deze gevallen kunt u elk door spaties gescheiden argument in een shell-opdracht beschouwen als een afzonderlijk element in de lijst die aan het subproces wordt geleverd.methode uitvoeren:.
Voorbeeld 2: Uitvoer van subproces onderdrukken.methode uitvoeren:
Om de uitvoer van het subproces te onderdrukken.run-methode, moet u "stdout=subprocess" opgeven.DEVNULL” en “stderr=subproces.DEVNULL” als aanvullende argumenten.
subproces importerensubproces.run(["kat", "gegevens.txt"], stdout=subproces.DEVNULL,
stderr=subproces.DEVNULL)
Als u de bovenstaande code uitvoert, wordt de volgende uitvoer geproduceerd:
CompletedProcess(args=['cat', 'data.txt'], retourcode=0)Voorbeeld 3: Uitvoer van subproces vastleggen.methode uitvoeren:
De uitvoer van het subproces vastleggen.run-methode, gebruik dan een extra argument met de naam “capture_output=True”.
subproces importerenoutput = subproces.run(["kat", "gegevens.txt"], capture_output=True)
afdrukken (uitvoer)
Als u de bovenstaande code uitvoert, wordt de volgende uitvoer geproduceerd:
CompletedProcess(args=['cat', 'data.txt'], retourcode=0,stdout=b'name=Jan\n', stderr=b")
U kunt afzonderlijk toegang krijgen tot stdout- en stderr-waarden door "output" te gebruiken.stdout" en "output".stderr” methoden. De uitvoer wordt geproduceerd als een bytereeks. Om een string als output te krijgen, gebruik je “output.stout.decoderen ("utf-8")" methode. Je kunt ook “text=True” als extra argument aan het subproces meegeven.voer de oproep uit om de uitvoer in tekenreeksindeling te krijgen. Om de exit-statuscode te krijgen, kunt u de "output" gebruiken.returncode” methode.
Voorbeeld 4: Uitzondering opheffen bij falen van opdracht uitgevoerd door subproces.methode uitvoeren:
Gebruik het argument "check=True" om een uitzondering te maken wanneer de opdracht wordt afgesloten met een status die niet nul is.
subproces importerensubproces.run(["kat", "gegevens.tx"], capture_output=True, text=True, check=True)
Als u de bovenstaande code uitvoert, wordt de volgende uitvoer geproduceerd:
raise CalledProcessError(retcode, process.argumenten,subproces.CalledProcessError: Commando '['cat', 'data.tx']'
geretourneerde niet-nul uitgangsstatus 1.
Voorbeeld 5: Een tekenreeks doorgeven aan een opdracht uitgevoerd door het subproces.methode uitvoeren:
U kunt een tekenreeks doorgeven aan de opdracht die moet worden uitgevoerd door subproces.methode uitvoeren met behulp van het argument "input='string'".
subproces importerenoutput = subproces.run(["cat"], input="data.txt", capture_output=True,
tekst=True, check=True)
afdrukken (uitvoer)
Als u de bovenstaande code uitvoert, wordt de volgende uitvoer geproduceerd:
CompletedProcess(args=['cat'], returncode=0, stdout="data.txt", stderr=")Zoals u kunt zien, geeft de bovenstaande code "data" door.txt" als een tekenreeks en niet als een bestandsobject. "gegevens" doorgeven.txt" als een bestand, gebruik dan het "stdin" argument.
met open("data.txt") als f:output = subproces.run(["cat"], stdin=f, capture_output=True,
tekst=True, check=True)
afdrukken (uitvoer)
Als u de bovenstaande code uitvoert, wordt de volgende uitvoer geproduceerd:
CompletedProcess(args=['cat'], returncode=0, stdout="name=John\n", stderr=")Voorbeeld 6: Voer de opdracht rechtstreeks in Shell uit met behulp van het subproces.methode uitvoeren:
Het is mogelijk om een commando rechtstreeks in een shell uit te voeren "zoals het is", in plaats van een string te gebruiken die is opgesplitst in het hoofdcommando en de opties die erop volgen. Om dit te doen, moet u "shell=True" doorgeven als een extra argument. Dit wordt echter afgeraden door python-ontwikkelaars, omdat het gebruik van "shell=True" tot beveiligingsproblemen kan leiden. U kunt hier meer lezen over beveiligingsimplicaties.
subproces importerensubproces.run("kat 'gegevens.txt'", shell = True)
Als u de bovenstaande code uitvoert, wordt de volgende uitvoer geproduceerd:
naam=JohnConclusie
Het subproces.run-methode in Python is behoorlijk krachtig, omdat je hiermee shell-opdrachten in python zelf kunt uitvoeren. Dit helpt bij het beperken van alle code tot python zelf zonder de noodzaak om extra shellscriptcode in aparte bestanden te hebben. Het kan echter behoorlijk lastig zijn om shell-commando's correct te tokeniseren in een python-lijst. U kunt de "shlex" gebruiken.split()”-methode om eenvoudige shell-opdrachten te tokeniseren, maar in lange, complexe opdrachten - vooral die met pijpsymbolen - slaagt shlex er niet in om de opdracht correct te splitsen. In dergelijke gevallen kan debuggen een lastige kwestie zijn. U kunt het argument "shell=True" gebruiken om dit te voorkomen, maar er zijn bepaalde beveiligingsproblemen verbonden aan deze actie.