Відповіді:
Модуль підпроцесую допоможе вам вийти.
Очевидно тривіальний приклад:
>>> import subprocess
>>> subprocess.call(['./test.sh']) # Thanks @Jim Dennis for suggesting the []
0
>>>
Де test.shпростий скрипт оболонки і 0його повернене значення для цього запуску.
chmod +x script.sh. Примітка: script.sh є заповнювачем вашого сценарію, замініть його відповідно.
Існують деякі способи використання os.popen()(застарілого) або всього subprocessмодуля, але такий підхід
import os
os.system(command)
є одним із найпростіших.
subprocessвас можна керувати вхідними / вихідними / помилковими трубами. Так само краще, коли у вас буде багато аргументів - з os.command()вами доведеться створити цілий командний рядок з утеченими спеціальними символами, при subprocessцьому є простий список аргументів. Але для простих завдань os.command() може бути просто достатньо.
The subprocess module provides more powerful facilities for spawning new processes and retrieving their results; *using that module is preferable to using this function.*
Якщо ви хочете передати деякі параметри до сценарію оболонки, ви можете скористатися методом shlex.split () :
import subprocess
import shlex
subprocess.call(shlex.split('./test.sh param1 param2'))
з test.shтією ж папкою:
#!/bin/sh
echo $1
echo $2
exit 0
Виходи:
$ python test.py
param1
param2
import os
import sys
Якщо припустити test.sh - це сценарій оболонки, який ви хочете виконати
os.system("sh test.sh")
Використовуйте модуль підпроцесу, як згадувалося вище.
Я використовую це так:
subprocess.call(["notepad"])
Я запускаю python 3.5 і subprocess.call (['./ test.sh']) для мене не працює.
Я даю вам три рішення залежить від того, що ви хочете зробити з результатом.
1 - сценарій виклику. Ви побачите вихід у своєму терміналі. вихід - число.
import subprocess
output = subprocess.call(['test.sh'])
2 - виконання і помилка виклику та помилка в рядку. Ви не бачите виконання у своєму терміналі, якщо ви не надрукуєте (stdout). Shell = Вірно, оскільки аргумент у Попена не працює для мене.
import subprocess
from subprocess import Popen, PIPE
session = subprocess.Popen(['test.sh'], stdout=PIPE, stderr=PIPE)
stdout, stderr = session.communicate()
if stderr:
raise Exception("Error "+str(stderr))
3 - скрипт виклику та скидання команд ехо команд temp.txt у temp_file
import subprocess
temp_file = open("temp.txt",'w')
subprocess.call([executable], stdout=temp_file)
with open("temp.txt",'r') as file:
output = file.read()
print(output)
Не забудьте поглянути на підпроцес doc
Підпроцесорний модуль - це хороший модуль для запуску підпроцесів. Ви можете використовувати його для виклику команд оболонки таким чином:
subprocess.call(["ls","-l"]);
#basic syntax
#subprocess.call(args, *)
Ви можете ознайомитись з його документацією тут.
Якщо у вас є сценарій, записаний у якомусь .sh-файлі чи довгій строці, ви можете використовувати модуль os.system. Зателефонувати досить просто:
import os
os.system("your command here")
# or
os.system('sh file.sh')
Ця команда запустить сценарій один раз, до завершення та блокує, поки він не завершиться.
У випадку, якщо сценарій має декілька аргументів
#!/usr/bin/python
import subprocess
output = subprocess.call(["./test.sh","xyz","1234"])
print output
Вихідні дані дадуть код статусу. Якщо сценарій працює успішно, він дасть 0 інакше не нульове ціле число.
podname=xyz serial=1234
0
Нижче - скрипт оболонки test.sh.
#!/bin/bash
podname=$1
serial=$2
echo "podname=$podname serial=$serial"
Підпроцес хороший, але деяким людям може подобатися сценарій краще. У Scriptine є більш високий набір таких методів, як shell.call (args) , path.rename (new_name) та path.move (src, dst) . Скриптин заснований на підпроцесі та інших.
Два недоліки сценарію:
Я знаю, що це давнє запитання, але я натрапив на це нещодавно, і це в результаті мене вводило в оману з моменту API Subprocess як змінено з python 3.5.
Новий спосіб виконання зовнішніх скриптів - це runфункція, яка виконує команду, описану args. Чекає завершення команди, а потім повертає екземпляр CompletedProcess.
import subprocess
subprocess.run(['./test.sh'])