Я пишу сценарий Python, и у меня заканчивается время. Я должен сделать некоторые вещи, которые я знаю вполне прилично в ударе, таким образом, я просто задаюсь вопросом, как я могу встроить некоторые строки удара в сценарий Python.
Спасибо
Если вы хотите вызывать системные команды, используйте модуль подпроцесс .
import os
os.system ("bash -c 'echo $0'")
сделает это за вас?
РЕДАКТИРОВАТЬ: относительно удобочитаемости
Да, конечно, вы можете сделать это более читабельным
import os
script = """
echo $0
ls -l
echo done
"""
os.system("bash -c '%s'" % script)
РЕДАКТИРОВАТЬ2: относительно макросов, никакой питон не идет так далеко насколько мне известно, но между
import os
def sh(script):
os.system("bash -c '%s'" % script)
sh("echo $0")
sh("ls -l")
sh("echo done")
и предыдущим примером вы в основном получаете то, что хотите (но вы должны учитывать некоторые диалектические ограничения)
Существует также модуль commands
, который дает больший контроль над выводом:
https: //docs.python.org/2/library/commands.html
Идеальный способ сделать это:
def run_script(script, stdin=None):
"""Returns (stdout, stderr), raises error on non-zero return code"""
import subprocess
# Note: by using a list here (['bash', ...]) you avoid quoting issues, as the
# arguments are passed in exactly this order (spaces, quotes, and newlines won't
# cause problems):
proc = subprocess.Popen(['bash', '-c', script],
stdout=subprocess.PIPE, stderr=subprocess.PIPE,
stdin=subprocess.PIPE)
stdout, stderr = proc.communicate()
if proc.returncode:
raise ScriptException(proc.returncode, stdout, stderr, script)
return stdout, stderr
class ScriptException(Exception):
def __init__(self, returncode, stdout, stderr, script):
self.returncode = returncode
self.stdout = stdout
self.stderr = stderr
Exception.__init__('Error in script')
Вы также можете добавить хороший метод __ str __
в ScriptException
(он вам обязательно понадобится для отладки ваших скриптов), но Я оставляю это читателю.
Если вы не используете stdout = subprocess.PIPE
и т. Д., То сценарий будет прикреплен непосредственно к консоли. Это действительно удобно, если у вас есть, например, запрос пароля от ssh. Таким образом, вы можете добавить флаги, чтобы контролировать, хотите ли вы захватывать stdout, stderr и stdin.
Предполагая, что команда поддерживается хост-системой:
import os
os.system('command')
Если у вас длинная команда или набор команд. вы можете использовать переменные. например:
# this simple line will capture column five of file.log
# and then removed blanklines, and gives output in filtered_content.txt.
import os
filter = "cat file.log | awk '{print $5}'| sed '/^$/d' > filtered_content.txt"
os.system(filter)