Python

Hoe Shell-opdrachten in Python uit te voeren met behulp van de Subprocess Run-methode

Hoe Shell-opdrachten in Python uit te voeren met behulp van de Subprocess Run-methode
Subprocess is een ingebouwde Python-module die kan worden gebruikt om nieuwe processen te creëren en te communiceren met hun invoer- en uitvoergegevensstromen. In eenvoudiger bewoordingen kunt u het gebruiken om shell-opdrachten uit te voeren en uitvoerbare binaire bestanden uit te voeren, meestal verspreid in verschillende "bin" -mappen over een Linux-bestandssysteem. U kunt ook een volledig pad naar een uitvoerbaar binair bestand opgeven en alle opdrachtregelopties gebruiken die aan het binaire bestand zijn gekoppeld. Dit artikel legt uit hoe je de subprocess-module en de run-methode gebruikt in Python-apps. Alle codevoorbeelden in het artikel zijn getest met Python 3.8.2 op Ubuntu 20.04.

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 importeren
subproces.run(["kat", "gegevens.tekst"])

Als u de bovenstaande code uitvoert, wordt de volgende uitvoer geretourneerd:

naam=John
CompletedProcess(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 importeren
subproces.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 importeren
output = 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 importeren
subproces.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 importeren
output = 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 importeren
subproces.run("kat 'gegevens.txt'", shell = True)

Als u de bovenstaande code uitvoert, wordt de volgende uitvoer geproduceerd:

naam=John

Conclusie

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.

AppyMouse trackpad en muisaanwijzer op het scherm voor Windows-tablets
Tabletgebruikers missen vaak de muisaanwijzer, vooral wanneer ze gewend zijn om de laptop te gebruiken. Het touchscreen Smartphones en tablets hebben ...
Middelste muisknop werkt niet in Windows 10
De middelste muis knop helpt u door lange webpagina's en schermen met veel gegevens te bladeren. Als dat stopt, zul je uiteindelijk het toetsenbord ge...
Hoe de linker- en rechtermuisknop op Windows 10 pc te veranderen
Het is nogal een norm dat alle computermuisapparaten ergonomisch zijn ontworpen voor rechtshandige gebruikers. Maar er zijn muisapparaten beschikbaar ...