Externe opdrachten uitvoeren in Python

Externe opdrachten uitvoeren in Python
Externe opdrachten uitvoeren in Python

Systeemopdrachten uitvoeren vanuit Python

Python biedt krachtige mogelijkheden voor het rechtstreeks vanuit uw scripts uitvoeren van externe programma's en systeemopdrachten. Met deze functie kunt u de eenvoud van Python benutten en tegelijkertijd profiteren van de enorme hoeveelheid tools die beschikbaar zijn in uw besturingssysteem.

Of u nu repetitieve taken automatiseert of complexe workflows integreert, als u begrijpt hoe u systeemopdrachten in Python moet aanroepen, kunt u uw productiviteit aanzienlijk verhogen. In deze handleiding verkennen we verschillende methoden om dit effectief te bereiken.

Commando Beschrijving
subprocess.run Voert een opdracht uit in een subshell. Kan uitvoer en fouten vastleggen.
subprocess.run([...], capture_output=True) Legt de standaarduitvoer en standaardfout van de uitgevoerde opdracht vast.
subprocess.run([...], shell=True) Voert de opdracht uit via de shell, waardoor shell-functies zoals jokertekens mogelijk zijn.
subprocess.Popen Voert een opdracht uit in een nieuw proces, waardoor er meer controle ontstaat over de uitvoering ervan.
process.stdout.readline() Leest een regel uitvoer uit de standaarduitvoer van het proces.
os.system Voert een opdracht uit in een subshell, vaak gebruikt voor eenvoudige uitvoering van opdrachten.
subprocess.check_output Voert een opdracht uit en retourneert de uitvoer ervan. Creëert een uitzondering als de opdracht mislukt.
os.environ.copy() Creëert een kopie van de huidige omgevingsvariabelen, waardoor wijzigingen mogelijk zijn.
env parameter in subprocess.run Specificeert omgevingsvariabelen voor het nieuwe proces.

Scriptuitvoering in Python begrijpen

De meegeleverde scripts demonstreren verschillende manieren om externe opdrachten uit te voeren met Python. De subprocess.run command is veelzijdig, waardoor u shell-opdrachten rechtstreeks vanuit uw Python-script kunt uitvoeren. Bijvoorbeeld, subprocess.run(['echo', 'Hello, World!']) drukt een bericht af naar de console, terwijl subprocess.run(['ls', '-l'], capture_output=True, text=True) vangt de uitvoer van de ls -l opdracht, waarbij een gedetailleerde directorylijst wordt weergegeven. Gebruik makend van shell=True met subprocess.run maakt het gebruik van shell-functies mogelijk, zoals uitbreiding van jokertekens, waardoor het handig is voor complexere opdrachten.

De subprocess.Popen command biedt meer controle over de uitvoering van opdrachten door asynchrone uitvoering van opdrachten en interactie met de invoer- en uitvoerstromen van het proces mogelijk te maken. Bijvoorbeeld het scriptvoorbeeld met subprocess.Popen(['ping', 'localhost'], stdout=subprocess.PIPE) pingt voortdurend de lokale machine en leest elke uitvoerregel. Aanvullend, os.system wordt gebruikt voor eenvoudige opdrachtuitvoering, maar mist de flexibiliteit van subprocess. Omgevingsvariabelen kunnen worden gewijzigd en doorgegeven aan het subproces met behulp van os.environ.copy() en de env parameter in subprocess.run, waardoor dynamische opdrachtuitvoering mogelijk is op basis van de omgeving.

Externe opdrachten uitvoeren in Python

Met behulp van de subprocesmodule van Python

import subprocess
# Example 1: Running a simple shell command
subprocess.run(['echo', 'Hello, World!'])
# Example 2: Capturing the output of a command
result = subprocess.run(['ls', '-l'], capture_output=True, text=True)
print(result.stdout)
# Example 3: Running a command with shell=True
subprocess.run('echo Hello from the shell', shell=True)
# Example 4: Checking the return code
result = subprocess.run(['ls', 'nonexistentfile'], capture_output=True)
if result.returncode != 0:
    print('Command failed')
# Example 5: Using subprocess.Popen for more control
process = subprocess.Popen(['ping', 'localhost'], stdout=subprocess.PIPE)
while True:
    output = process.stdout.readline()
    if output == b'' and process.poll() is not None:
        break
    if output:
        print(output.strip().decode())

Systeemtaken automatiseren met Python

Met behulp van os.system- en subprocess-modules

import os
import subprocess
# Example 1: Using os.system to run a command
os.system('echo This is a test')
# Example 2: Running a command and capturing output with subprocess
result = subprocess.run(['date'], capture_output=True, text=True)
print('Current date and time:', result.stdout)
# Example 3: Executing multiple commands
commands = ['echo First command', 'echo Second command']
for cmd in commands:
    os.system(cmd)
# Example 4: Running a command with environment variables
env = os.environ.copy()
env['MY_VAR'] = 'Hello'
subprocess.run('echo $MY_VAR', shell=True, env=env)
# Example 5: Handling command errors
try:
    subprocess.check_output(['false_command'], stderr=subprocess.STDOUT)
except subprocess.CalledProcessError as e:
    print('An error occurred:', e.output.decode())

Geavanceerde technieken voor het uitvoeren van systeemopdrachten

Een ander aspect van het uitvoeren van systeemopdrachten in Python is het gebruik van de shlex module om het parseren van shell-opdrachten af ​​te handelen. Deze module biedt een manier om shell-opdrachten op te splitsen in een lijstindeling, waaraan vervolgens kan worden doorgegeven subprocess functies. Dit zorgt ervoor dat argumenten met spaties correct worden afgehandeld. Daarnaast kunt u gebruik maken van de subprocess.PIPE om de standaardinvoer-, uitvoer- en foutstromen naar het bovenliggende proces te leiden, waardoor complexere communicatie tussen processen mogelijk wordt.

Het aan elkaar koppelen van commando's en het opeenvolgend verwerken van de uitvoer ervan kan bijvoorbeeld worden bereikt door de uitvoer van het ene commando naar het andere te leiden met behulp van subprocess.Popen. Hierdoor kunt u krachtige opdrachtreeksen maken, vergelijkbaar met wat u in een shellscript zou doen. Je kan ook gebruiken threading om meerdere subprocesopdrachten gelijktijdig uit te voeren, waardoor de efficiëntie van uw script wordt verbeterd, vooral bij het omgaan met I/O-gebonden taken.

Veelgestelde vragen over het uitvoeren van systeemopdrachten in Python

  1. Hoe kan ik een shell-opdracht uitvoeren en de uitvoer ervan in Python krijgen?
  2. Gebruik subprocess.run met capture_output=True om de uitvoer van de opdracht vast te leggen.
  3. Wat is het verschil tussen subprocess.run En subprocess.Popen?
  4. subprocess.run is een eenvoudiger interface die wacht tot de opdracht is voltooid, terwijl subprocess.Popen geeft meer controle over de uitvoering van opdrachten, waardoor asynchrone werking mogelijk is.
  5. Hoe ga ik om met fouten bij het uitvoeren van een systeemopdracht?
  6. Gebruik try En except blokken mee subprocess.CalledProcessError fouten op te sporen en af ​​te handelen.
  7. Kan ik omgevingsvariabelen doorgeven aan een opdracht?
  8. Ja, gebruik de env parameter in subprocess.run of subprocess.Popen omgevingsvariabelen doorgeven.
  9. Hoe voer ik meerdere opdrachten achter elkaar uit?
  10. Gebruik subprocess.run of subprocess.Popen in een lus of kettingopdrachten met behulp van pijpen met subprocess.Popen.
  11. Hoe kan ik een opdracht uitvoeren waarvoor gebruikersinvoer vereist is?
  12. Gebruik subprocess.Popen met stdin=subprocess.PIPE en communiceer met het proces via process.communicate.
  13. Wat is het gebruik van shlex bij de uitvoering van commando's?
  14. shlex helpt bij het correct parseren van shell-opdrachten, waardoor argumenten met spaties correct worden afgehandeld.
  15. Hoe voer ik een opdracht uit op de achtergrond?
  16. Gebruik subprocess.Popen zonder te wachten tot het proces is voltooid of te gebruiken threading om de uitvoering op de achtergrond te beheren.

Geavanceerde technieken voor het uitvoeren van systeemopdrachten

Een ander aspect van het uitvoeren van systeemopdrachten in Python is het gebruik van de shlex module om het parseren van shell-opdrachten af ​​te handelen. Deze module biedt een manier om shell-opdrachten op te splitsen in een lijstindeling, waaraan vervolgens kan worden doorgegeven subprocess functies. Dit zorgt ervoor dat argumenten met spaties correct worden afgehandeld. Daarnaast kunt u gebruik maken van de subprocess.PIPE om de standaardinvoer-, uitvoer- en foutstromen naar het bovenliggende proces te leiden, waardoor complexere communicatie tussen processen mogelijk wordt.

Het aan elkaar koppelen van commando's en het opeenvolgend verwerken van de uitvoer ervan kan bijvoorbeeld worden bereikt door de uitvoer van het ene commando naar het andere te leiden met behulp van subprocess.Popen. Hierdoor kunt u krachtige opdrachtreeksen maken, vergelijkbaar met wat u in een shellscript zou doen. Je kan ook gebruiken threading om meerdere subprocesopdrachten gelijktijdig uit te voeren, waardoor de efficiëntie van uw script wordt verbeterd, vooral bij het omgaan met I/O-gebonden taken.

Laatste gedachten over het uitvoeren van opdrachten in Python

Het uitvoeren van externe opdrachten in Python is een veelzijdige en krachtige mogelijkheid die uw script- en automatiseringstaken aanzienlijk kan verbeteren. Door gebruik te maken van de subprocess module kunt u shell-opdrachten uitvoeren, de uitvoer ervan vastleggen en fouten effectief afhandelen. De os.system functie biedt een eenvoudiger alternatief voor de uitvoering van basisopdrachten. Bovendien is het opnemen van de shlex module zorgt voor een goede parsering van complexe shell-opdrachten. Als u deze technieken begrijpt, kunt u de sterke punten van Python benutten en tegelijkertijd het volledige potentieel van de opdrachtregelprogramma's van uw besturingssysteem benutten.