Вывод канала из команды shell в скрипт python

Вывод канала из команды shell в скрипт python

20.06.2012 01:39:06 Просмотров 21 Источник

Я хочу запустить команду mysqlи установить ее выход в качестве переменной в моем скрипте python.

Вот команда оболочки, которую я пытаюсь запустить:

$ mysql my_database --html -e "select * from limbs" | ./script.py

Вот скрипт на python:

#!/usr/bin/env python

import sys

def hello(variable):
    print variable

Как бы я принял переменную в скрипте python и заставил ее распечатать вывод?

У вопроса есть решение - Посмотреть?

Ответы - Вывод канала из команды shell в скрипт python / Pipe output from shell command to a python script

C0deH4cker

20.06.2012 01:44:28

Когда вы передаете выходные данные одной команды скрипту pytho, он переходит в sys.стандартный ввод. Вы можете читать из sys.stdin просто как файл. Пример:

import sys

print sys.stdin.read()

Эта программа буквально выводит свои входные данные.

https://stackoverflow.com/questions/11109859/pipe-output-from-shell-command-to-a-python-script/11109920#comment14554746_11109920
+1 за упоминание "просто как файл", что, надеюсь, заставит ОП понять, что он также может делать такие вещи, как " for line in sys.стдин: "и т. д.
Является ответом!
Jon Cage

20.06.2012 01:44:46

Вам нужно прочитать из stdin, чтобы получить данные в скрипте python, например

#!/usr/bin/env python

import sys

def hello(variable):
    print variable

data = sys.stdin.read()
hello(data)

Если все, что вы хотите сделать здесь, это захватить некоторые данные из базы данных mysql, а затем манипулировать ими с помощью Python, я бы пропустил передачу их в скрипт и просто использовал модуль Python MySql для выполнения SQL-запроса.

mstringer

20.06.2012 03:53:21

Если вы хотите, чтобы ваш сценарий вел себя как многие средства командной строки unix и принимал канал или имя файла в качестве первого аргумента, вы можете использовать следующее:

#!/usr/bin/env python
import sys

# use stdin if it's full                                                        
if not sys.stdin.isatty():
    input_stream = sys.stdin

# otherwise, read the given filename(s)                                         
else:
    try:
        input_filename = sys.argv[1:]
    except IndexError:
        message = 'need filename as first argument if stdin is not full'
        raise IndexError(message)
    else:
        input_stream = open(input_filename, 'rU')

for line in input_stream:
    print(line) # do something useful with each line
nlsdfnbch

09.01.2017 12:41:04

Поскольку этот ответ появляется в Google в верхней части при поиске piping data to a python script, я хотел бы добавить еще один метод, который я нашел в Поваренной книге Дж .Бизли Python после поиска менее "зернистого" подхода, чем использование sys. ИМО, более питонский и понятный даже для новых пользователей.

import fileinput
with fileinput.input() as f_input:
    for line in f_input:
        print(line, end='')

Этот подход также работает для команд, структурированных следующим образом:

$ ls | ./filein.py          # Prints a directory listing to stdout.
$ ./filein.py /etc/passwd   # Reads /etc/passwd to stdout.
$ ./filein.py < /etc/passwd # Reads /etc/passwd to stdout.

Если Вам требуются более сложные решения, вы можете компилировать argparseи fileinput, как показано в этой статье martinth:

import argpase
import fileinput

if __name__ == '__main__':
    parser = ArgumentParser()
    parser.add_argument('--dummy', help='dummy argument')
    parser.add_argument('files', metavar='FILE', nargs='*', help='files to read, if empty, stdin is used')
    args = parser.parse_args()

    # If you would call fileinput.input() without files it would try to process all arguments.
    # We pass '-' as only file when argparse got no files which will cause fileinput to read from stdin
    for line in fileinput.input(files=args.files if len(args.files) > 0 else ('-', )):
        print(line)

``

https://stackoverflow.com/questions/11109859/pipe-output-from-shell-command-to-a-python-script/41544950#comment82784524_41544950
Получение ошибки с помощью этого метода (с использованием python 2.7) Traceback (последний вызов последнего): File". /pipetome.py", строка 4, в <модуле> с fileinput.input () как f_input: AttributeError: fileinput экземпляр не имеет атрибута ' exit '
https://stackoverflow.com/questions/11109859/pipe-output-from-shell-command-to-a-python-script/41544950#comment82786466_41544950
Вышеизложенное было проверено только в Python3-возможно, вместо with?
https://stackoverflow.com/questions/11109859/pipe-output-from-shell-command-to-a-python-script/41544950#comment88146715_41544950
но как отличить Аргументы и stdin, электронная.г send_mail -к xxx@xxx.com -предмет 'пароль' < в /etc/passwd с
https://stackoverflow.com/questions/11109859/pipe-output-from-shell-command-to-a-python-script/41544950#comment88252173_41544950
Я обновил ответ примером решения вашей заявленной проблемы.
Alex Thomas

04.10.2018 11:20:14

Я наткнулся на это, пытаясь передать команду bash скрипту python, который я не писал (и не хотел изменять, чтобы принять sys.stdin). Я нашел замену процесса, упомянутую здесь ( https://superuser.com/questions/461946/can-i-use-pipe-output-as-a-shell-script-argument ) работать нормально.

Экс. some_script.py -arg1 <(bash command)

Закрыть X