Hur man kör externa kommandon i Python

Hur man kör externa kommandon i Python
Hur man kör externa kommandon i Python

Kör systemkommandon från Python

Python ger kraftfulla funktioner för att köra externa program och systemkommandon direkt från dina skript. Den här funktionen låter dig utnyttja Pythons enkelhet samtidigt som du drar nytta av det stora utbudet av verktyg som finns i ditt operativsystem.

Oavsett om du automatiserar repetitiva uppgifter eller integrerar komplexa arbetsflöden, kan en förståelse för hur man anropar systemkommandon i Python förbättra din produktivitet avsevärt. I den här guiden kommer vi att utforska olika metoder för att uppnå detta effektivt.

Kommando Beskrivning
subprocess.run Utför ett kommando i ett underskal. Kan fånga utdata och fel.
subprocess.run([...], capture_output=True) Fångar standardutdata och standardfel för det körda kommandot.
subprocess.run([...], shell=True) Kör kommandot genom skalet, vilket tillåter skalfunktioner som jokertecken.
subprocess.Popen Utför ett kommando i en ny process, vilket ger mer kontroll över dess exekvering.
process.stdout.readline() Läser en utdatarad från processens standardutdata.
os.system Kör ett kommando i ett underskal, som vanligtvis används för enkel kommandoexekvering.
subprocess.check_output Kör ett kommando och returnerar dess utdata. Ger ett undantag om kommandot misslyckas.
os.environ.copy() Skapar en kopia av de aktuella miljövariablerna, vilket tillåter ändringar.
env parameter in subprocess.run Anger miljövariabler för den nya processen.

Förstå skriptkörning i Python

Skripten som tillhandahålls visar olika sätt att utföra externa kommandon med Python. De subprocess.run kommandot är mångsidigt, vilket gör att du kan köra skalkommandon direkt från ditt Python-skript. Till exempel, subprocess.run(['echo', 'Hello, World!']) skriver ut ett meddelande till konsolen, medan subprocess.run(['ls', '-l'], capture_output=True, text=True) fångar resultatet av ls -l kommando, visar en detaljerad kataloglista. Använder sig av shell=True med subprocess.run tillåter användning av skalfunktioner, som jokerteckenexpansion, vilket gör det praktiskt för mer komplexa kommandon.

De subprocess.Popen kommando ger mer kontroll över kommandoexekveringen genom att tillåta asynkron kommandokörning och interaktion med processens in- och utströmmar. Till exempel skriptexemplet med subprocess.Popen(['ping', 'localhost'], stdout=subprocess.PIPE) plingar kontinuerligt den lokala maskinen och läser varje utdatarad. Dessutom, os.system används för enkel kommandoexekvering men saknar flexibiliteten för subprocess. Miljövariabler kan modifieras och skickas till underprocessen med hjälp av os.environ.copy() och den env parameter in subprocess.run, vilket tillåter dynamisk kommandoexekvering baserat på miljön.

Utför externa kommandon i Python

Använder Pythons delprocessmodul

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())

Automatisera systemuppgifter med Python

Använder os.system och subprocess moduler

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())

Avancerade tekniker för utförande av systemkommandon

En annan aspekt av att köra systemkommandon i Python involverar att använda shlex modul för att hantera skalkommandoanalys. Den här modulen ger ett sätt att dela upp skalkommandon i ett listformat, som sedan kan skickas till subprocess funktioner. Detta säkerställer att argument med mellanslag hanteras korrekt. Dessutom kan du använda subprocess.PIPE att styra standardinmatning, utdata och felströmmar till moderprocessen, vilket möjliggör mer komplex kommunikation mellan processer.

Till exempel kan kedja av kommandon och bearbeta deras utdata sekventiellt genom att koppla utdata från ett kommando till ett annat med subprocess.Popen. Detta låter dig skapa kraftfulla kommandosekvenser som liknar vad du skulle göra i ett skalskript. Du kan också använda threading att köra flera underprocesskommandon samtidigt, vilket förbättrar effektiviteten i ditt skript, särskilt när du hanterar I/O-bundna uppgifter.

Vanliga frågor om exekvering av systemkommandon i Python

  1. Hur kan jag köra ett skalkommando och få dess utdata i Python?
  2. Använda sig av subprocess.run med capture_output=True för att fånga kommandots utdata.
  3. Vad är skillnaden mellan subprocess.run och subprocess.Popen?
  4. subprocess.run är ett enklare gränssnitt som väntar på att kommandot ska slutföras, medan subprocess.Popen ger mer kontroll över kommandoexekveringen, vilket möjliggör asynkron drift.
  5. Hur hanterar jag fel när jag kör ett systemkommando?
  6. Använda sig av try och except block med subprocess.CalledProcessError att fånga och hantera fel.
  7. Kan jag skicka miljövariabler till ett kommando?
  8. Ja, använd env parameter in subprocess.run eller subprocess.Popen att skicka miljövariabler.
  9. Hur kör jag flera kommandon i följd?
  10. Använda sig av subprocess.run eller subprocess.Popen i en slinga eller kedja kommandon med hjälp av rör med subprocess.Popen.
  11. Hur kan jag utföra ett kommando som kräver användarinmatning?
  12. Använda sig av subprocess.Popen med stdin=subprocess.PIPE och kommunicera med processen med hjälp av process.communicate.
  13. Vad är användningen för shlex vid kommandoexekvering?
  14. shlex hjälper till att analysera skalkommandon korrekt, vilket säkerställer att argument med mellanslag hanteras korrekt.
  15. Hur kör jag ett kommando i bakgrunden?
  16. Använda sig av subprocess.Popen utan att vänta på att processen ska slutföras eller använda threading för att hantera bakgrundsexekvering.

Avancerade tekniker för utförande av systemkommandon

En annan aspekt av att köra systemkommandon i Python involverar att använda shlex modul för att hantera skalkommandoanalys. Den här modulen ger ett sätt att dela upp skalkommandon i ett listformat, som sedan kan skickas till subprocess funktioner. Detta säkerställer att argument med mellanslag hanteras korrekt. Dessutom kan du använda subprocess.PIPE att styra standardinmatning, utdata och felströmmar till moderprocessen, vilket möjliggör mer komplex kommunikation mellan processer.

Till exempel kan kedja av kommandon och bearbeta deras utdata sekventiellt genom att koppla utdata från ett kommando till ett annat med subprocess.Popen. Detta låter dig skapa kraftfulla kommandosekvenser som liknar vad du skulle göra i ett skalskript. Du kan också använda threading att köra flera underprocesskommandon samtidigt, vilket förbättrar effektiviteten i ditt skript, särskilt när du hanterar I/O-bundna uppgifter.

Sista tankar om att köra kommandon i Python

Att köra externa kommandon i Python är en mångsidig och kraftfull funktion som avsevärt kan förbättra dina skript- och automatiseringsuppgifter. Genom att använda subprocess modul kan du köra skalkommandon, fånga deras utdata och hantera fel effektivt. De os.system funktion ger ett enklare alternativ för grundläggande kommandoexekvering. Dessutom införlivar shlex modulen säkerställer korrekt analys av komplexa skalkommandon. Genom att förstå dessa tekniker kan du dra nytta av Pythons styrkor samtidigt som du utnyttjar den fulla potentialen hos ditt operativsystems kommandoradsverktyg.