Встройте избивают Python

Я пишу сценарий Python, и у меня заканчивается время. Я должен сделать некоторые вещи, которые я знаю вполне прилично в ударе, таким образом, я просто задаюсь вопросом, как я могу встроить некоторые строки удара в сценарий Python.

Спасибо

18
задан Thanatos 4 January 2012 в 21:40
поделиться

5 ответов

Если вы хотите вызывать системные команды, используйте модуль подпроцесс .

12
ответ дан 30 November 2019 в 06:19
поделиться

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

и предыдущим примером вы в основном получаете то, что хотите (но вы должны учитывать некоторые диалектические ограничения)

5
ответ дан 30 November 2019 в 06:19
поделиться

Существует также модуль commands , который дает больший контроль над выводом: https: //docs.python.org/2/library/commands.html

0
ответ дан 30 November 2019 в 06:19
поделиться

Идеальный способ сделать это:

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.

29
ответ дан 30 November 2019 в 06:19
поделиться

Предполагая, что команда поддерживается хост-системой:

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)
3
ответ дан 30 November 2019 в 06:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: