Како извршити екстерне команде у Питхон-у

Како извршити екстерне команде у Питхон-у
Како извршити екстерне команде у Питхон-у

Покретање системских команди из Питхон-а

Питхон пружа моћне могућности за извршавање спољних програма и системских команди директно из ваших скрипти. Ова функција вам омогућава да искористите Питхон-ову једноставност док истовремено користите предности широког спектра алата доступних у вашем оперативном систему.

Без обзира да ли аутоматизујете задатке који се понављају или интегришете сложене токове посла, разумевање како да позовете системске команде у Питхон-у може значајно да побољша вашу продуктивност. У овом водичу ћемо истражити различите методе како бисмо ово ефикасно постигли.

Цомманд Опис
subprocess.run Извршава команду у подљусци. Може да ухвати излаз и грешке.
subprocess.run([...], capture_output=True) Снима стандардни излаз и стандардну грешку извршене команде.
subprocess.run([...], shell=True) Покреће команду кроз љуску, дозвољавајући функције љуске попут џокер знакова.
subprocess.Popen Извршава команду у новом процесу, пружајући већу контролу над њеним извршавањем.
process.stdout.readline() Чита линију излаза из стандардног излаза процеса.
os.system Извршава команду у подљусци, која се обично користи за једноставно извршавање команде.
subprocess.check_output Покреће команду и враћа њен излаз. Покреће изузетак ако команда не успе.
os.environ.copy() Прави копију тренутних променљивих окружења, дозвољавајући измене.
env parameter in subprocess.run Одређује варијабле окружења за нови процес.

Разумевање извршавања скрипте у Питхон-у

Достављене скрипте показују различите начине за извршавање спољних команди помоћу Питхон-а. Тхе subprocess.run команда је разноврсна и омогућава вам да покрећете команде љуске директно из ваше Питхон скрипте. На пример, subprocess.run(['echo', 'Hello, World!']) штампа поруку на конзоли, док subprocess.run(['ls', '-l'], capture_output=True, text=True) хвата излаз ls -l команду, која приказује детаљну листу директоријума. Користећи shell=True са subprocess.run омогућава коришћење функција љуске, као што је проширење џокер знакова, што га чини згодним за сложеније команде.

Тхе subprocess.Popen команда пружа већу контролу над извршавањем команде дозвољавајући асинхроне команде и интеракцију са улазним и излазним токовима процеса. На пример, пример скрипте са subprocess.Popen(['ping', 'localhost'], stdout=subprocess.PIPE) континуирано пингује локалну машину и чита сваку линију излаза. Поред тога, os.system се користи за једноставно извршавање наредби, али му недостаје флексибилност subprocess. Променљиве окружења се могу модификовати и прослеђивати потпроцесу помоћу os.environ.copy() анд тхе env параметар у subprocess.run, омогућавајући динамичко извршавање наредби на основу окружења.

Извршавање спољних команди у Питхон-у

Коришћење Питхоновог модула подпроцеса

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

Аутоматизација системских задатака са Питхон-ом

Коришћење модула ос.система и подпроцеса

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

Напредне технике за извршавање системских команди

Други аспект извршавања системских команди у Питхон-у укључује коришћење shlex модул за руковање рашчлањивањем команди љуске. Овај модул пружа начин да се команде љуске поделе у формат листе, који се затим може прослеђивати subprocess функције. Ово осигурава да се аргументи са размацима правилно рукују. Поред тога, можете користити subprocess.PIPE да усмери стандардне улазне, излазне и токове грешака у родитељски процес, омогућавајући сложенију међупроцесну комуникацију.

На пример, уланчавање команди и узастопна обрада њиховог излаза може се постићи преношењем излаза једне команде у другу користећи subprocess.Popen. Ово вам омогућава да креирате моћне командне секвенце сличне ономе што бисте радили у схелл скрипти. Такође можете користити threading да истовремено покреће више команди подпроцеса, побољшавајући ефикасност ваше скрипте, посебно када се бавите задацима везаним за У/И.

Често постављана питања о извршавању системских наредби у Питхон-у

  1. Како могу да покренем команду љуске и добијем њен излаз у Питхон-у?
  2. Користите subprocess.run са capture_output=True за снимање излаза команде.
  3. Која је разлика између subprocess.run и subprocess.Popen?
  4. subprocess.run је једноставнији интерфејс који чека да се наредба заврши, док subprocess.Popen даје већу контролу над извршавањем команде, омогућавајући асинхрони рад.
  5. Како да решим грешке приликом покретања системске команде?
  6. Користите try и except блокови са subprocess.CalledProcessError да ухвати и обради грешке.
  7. Могу ли да проследим променљиве окружења команди?
  8. Да, користите env параметар у subprocess.run или subprocess.Popen да пренесе променљиве окружења.
  9. Како да покренем више команди у низу?
  10. Користите subprocess.run или subprocess.Popen у петљи или ланцу команди користећи цеви са subprocess.Popen.
  11. Како могу да извршим команду која захтева кориснички унос?
  12. Користите subprocess.Popen са stdin=subprocess.PIPE и комуницирају са процесом користећи process.communicate.
  13. Каква је корист од shlex у извршењу команде?
  14. shlex помаже правилно рашчлањивање команди љуске, обезбеђујући да се аргументи са размацима правилно рукују.
  15. Како да покренем команду у позадини?
  16. Користите subprocess.Popen без чекања да се процес заврши или употребе threading за управљање извршавањем у позадини.

Напредне технике за извршавање системских команди

Други аспект извршавања системских команди у Питхон-у укључује коришћење shlex модул за руковање рашчлањивањем команди љуске. Овај модул пружа начин да се команде љуске поделе у формат листе, који се затим може прослеђивати subprocess функције. Ово осигурава да се аргументи са размацима правилно рукују. Поред тога, можете користити subprocess.PIPE да усмери стандардне улазне, излазне и токове грешака у родитељски процес, омогућавајући сложенију међупроцесну комуникацију.

На пример, уланчавање команди и узастопна обрада њиховог излаза може се постићи преношењем излаза једне команде у другу користећи subprocess.Popen. Ово вам омогућава да креирате моћне командне секвенце сличне ономе што бисте радили у схелл скрипти. Такође можете користити threading да истовремено покреће више команди подпроцеса, побољшавајући ефикасност ваше скрипте, посебно када се бавите задацима везаним за У/И.

Завршна размишљања о извршавању команди у Питхон-у

Извршавање екстерних команди у Питхон-у је разноврсна и моћна могућност која може значајно побољшати ваше задатке скриптовања и аутоматизације. Коришћењем subprocess модула, можете покренути команде љуске, ухватити њихове излазе и ефикасно руковати грешкама. Тхе os.system функција пружа једноставнију алтернативу за извршавање основних команди. Поред тога, укључивање shlex модул обезбеђује правилно рашчлањивање сложених команди љуске. Разумевање ових техника вам омогућава да искористите предности Питхон-а док истовремено користите пун потенцијал алата командне линије вашег оперативног система.