Com executar ordres externes a Python

Com executar ordres externes a Python
Com executar ordres externes a Python

Execució d'ordres del sistema des de Python

Python ofereix potents capacitats per executar programes externs i ordres del sistema directament des dels vostres scripts. Aquesta característica us permet aprofitar la senzillesa de Python alhora que aprofiteu la gran varietat d'eines disponibles al vostre sistema operatiu.

Tant si esteu automatitzant tasques repetitives com si integreu fluxos de treball complexos, entendre com cridar ordres del sistema a Python pot millorar significativament la vostra productivitat. En aquesta guia, explorarem diferents mètodes per aconseguir-ho de manera eficaç.

Comandament Descripció
subprocess.run Executa una ordre en un subshell. Pot capturar resultats i errors.
subprocess.run([...], capture_output=True) Captura la sortida estàndard i l'error estàndard de l'ordre executada.
subprocess.run([...], shell=True) Executa l'ordre a través de l'intèrpret d'ordres, permetent funcions de l'intèrpret d'ordres com els comodins.
subprocess.Popen Executa una ordre en un procés nou, proporcionant més control sobre la seva execució.
process.stdout.readline() Llegeix una línia de sortida de la sortida estàndard del procés.
os.system Executa una ordre en un subshell, que s'utilitza habitualment per a l'execució simple d'ordres.
subprocess.check_output Executa una ordre i retorna la seva sortida. Genera una excepció si l'ordre falla.
os.environ.copy() Crea una còpia de les variables d'entorn actuals, permetent modificacions.
env parameter in subprocess.run Especifica variables d'entorn per al nou procés.

Entendre l'execució d'scripts en Python

Els scripts proporcionats mostren diverses maneres d'executar ordres externes mitjançant Python. El subprocess.run L'ordre és versàtil i us permet executar ordres d'intèrpret d'ordres directament des del vostre script de Python. Per exemple, subprocess.run(['echo', 'Hello, World!']) imprimeix un missatge a la consola, mentre subprocess.run(['ls', '-l'], capture_output=True, text=True) captura la sortida de la ls -l comanda, que mostra una llista de directoris detallada. Utilitzant shell=True amb subprocess.run permet l'ús de funcions de l'intèrpret d'ordres, com ara l'expansió de comodins, el que és útil per a ordres més complexes.

El subprocess.Popen L'ordre proporciona més control sobre l'execució d'ordres permetent l'execució d'ordres asíncrones i la interacció amb els fluxos d'entrada i sortida del procés. Per exemple, l'exemple de guió amb subprocess.Popen(['ping', 'localhost'], stdout=subprocess.PIPE) fa ping contínuament a la màquina local i llegeix cada línia de sortida. A més, os.system s'utilitza per a l'execució d'ordres senzilles, però no té la flexibilitat de subprocess. Les variables d'entorn es poden modificar i passar al subprocés utilitzant os.environ.copy() i la env paràmetre a subprocess.run, permetent l'execució d'ordres dinàmiques en funció de l'entorn.

Execució d'ordres externes en Python

Utilitzant el mòdul de subprocés de 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())

Automatització de les tasques del sistema amb Python

Utilitzant mòduls os.system i subprocés

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

Tècniques avançades per a l'execució d'ordres del sistema

Un altre aspecte de l'execució d'ordres del sistema a Python consisteix a utilitzar el shlex mòdul per gestionar l'anàlisi d'ordres de l'intèrpret d'ordres. Aquest mòdul proporciona una manera de dividir les ordres de l'intèrpret d'ordres en un format de llista, que després es pot passar subprocess funcions. Això garanteix que els arguments amb espais es gestionen correctament. A més, podeu utilitzar el subprocess.PIPE per dirigir els fluxos d'entrada, sortida i error estàndard al procés principal, permetent una comunicació entre processos més complexa.

Per exemple, encadenar ordres i processar la seva sortida seqüencialment es pot aconseguir canalitzant la sortida d'una ordre a una altra utilitzant subprocess.Popen. Això us permet crear seqüències d'ordres potents similars a les que farieu en un script de shell. També pots utilitzar threading per executar diverses ordres de subprocés simultàniament, millorant l'eficiència del vostre script, especialment quan tracteu tasques vinculades a E/S.

Preguntes freqüents sobre l'execució d'ordres del sistema en Python

  1. Com puc executar una ordre de shell i obtenir la seva sortida a Python?
  2. Ús subprocess.run amb capture_output=True per capturar la sortida de l'ordre.
  3. Quina és la diferència entre subprocess.run i subprocess.Popen?
  4. subprocess.run és una interfície més senzilla que espera que es completi l'ordre, mentre subprocess.Popen ofereix més control sobre l'execució d'ordres, permetent un funcionament asíncron.
  5. Com puc gestionar els errors quan executo una ordre del sistema?
  6. Ús try i except blocs amb subprocess.CalledProcessError per detectar i gestionar errors.
  7. Puc passar variables d'entorn a una ordre?
  8. Sí, utilitza el env paràmetre a subprocess.run o subprocess.Popen per passar variables d'entorn.
  9. Com executo diverses ordres en seqüència?
  10. Ús subprocess.run o subprocess.Popen en un bucle o ordres en cadena utilitzant tubs amb subprocess.Popen.
  11. Com puc executar una ordre que requereix l'entrada de l'usuari?
  12. Ús subprocess.Popen amb stdin=subprocess.PIPE i comunicar-se amb el procés utilitzant process.communicate.
  13. De què serveix shlex en execució de comandaments?
  14. shlex ajuda a analitzar les ordres de l'intèrpret d'ordres correctament, assegurant que els arguments amb espais es gestionen correctament.
  15. Com executo una ordre en segon pla?
  16. Ús subprocess.Popen sense esperar que el procés finalitzi, ni utilitzar-lo threading per gestionar l'execució en segon pla.

Tècniques avançades per a l'execució d'ordres del sistema

Un altre aspecte de l'execució d'ordres del sistema a Python consisteix a utilitzar el shlex mòdul per gestionar l'anàlisi d'ordres de l'intèrpret d'ordres. Aquest mòdul proporciona una manera de dividir les ordres de l'intèrpret d'ordres en un format de llista, que després es pot passar subprocess funcions. Això garanteix que els arguments amb espais es gestionen correctament. A més, podeu utilitzar el subprocess.PIPE per dirigir els fluxos d'entrada, sortida i error estàndard al procés principal, permetent una comunicació entre processos més complexa.

Per exemple, encadenant ordres i processar la seva sortida seqüencialment es pot aconseguir canalitzant la sortida d'una ordre a una altra utilitzant subprocess.Popen. Això us permet crear seqüències d'ordres potents similars a les que farieu en un script de shell. També pots utilitzar threading per executar diverses ordres de subprocés simultàniament, millorant l'eficiència del vostre script, especialment quan tracteu tasques vinculades a E/S.

Consideracions finals sobre l'execució d'ordres a Python

Executar ordres externes a Python és una capacitat versàtil i potent que pot millorar significativament les vostres tasques d'automatització i scripts. Mitjançant l'ús de subprocess mòdul, podeu executar ordres de l'intèrpret d'ordres, capturar les seves sortides i gestionar els errors de manera eficaç. El os.system La funció proporciona una alternativa més senzilla per a l'execució d'ordres bàsiques. A més, incorporant el shlex El mòdul garanteix l'anàlisi correcta de les ordres de l'intèrpret d'ordres complexes. Entendre aquestes tècniques us permet aprofitar els punts forts de Python alhora que utilitzeu tot el potencial de les eines de línia d'ordres del vostre sistema operatiu.