Ответы:
Модуль подпроцесса поможет вам.
Очевидно тривиальный пример:
>>> 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 = True, поскольку аргумент в Popen не работает для меня.
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 - вызвать скрипт и вывести команды echo файла 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 , как изменились с тех пор питона 3.5.
Новый способ выполнения внешних скриптов - с помощью run
функции, которая запускает команду, описанную args. Ожидает завершения команды, затем возвращает экземпляр CompletedProcess.
import subprocess
subprocess.run(['./test.sh'])