2012-06-19 2 views
18

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

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

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

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

#!/usr/bin/env python 

import sys 

def hello(variable): 
    print variable 

Как бы я принять переменную в сценарии питона и иметь его печать выход?

ответ

19

Вам необходимо прочитать из stdin для извлечения данных в сценарии python, например.

#!/usr/bin/env python 

import sys 

def hello(variable): 
    print variable 

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

Если все, что вы хотите сделать здесь захватить некоторые данные из базы данных MySQL, а затем манипулировать с Python, я бы пропустить его конвейеру в сценарий и просто использовать the Python MySql module сделать запрос SQL.

+0

+1 для предложения mysql-python. – abarnert

9

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

import sys 

print sys.stdin.read() 

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

+1

+1 за упоминание «как файл», который, мы надеемся, приведет к OP, чтобы понять, что он также может делать такие вещи, как «для line в sys.stdin: "и т. д. – abarnert

16

Если вы хотите, чтобы ваш скрипт вести себя, как много инструментов командной строки 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            
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 
2

Поскольку этот ответ появляется на Google на top при поиске piping data to a python script, я хотел бы добавить еще один метод, который я нашел в J. Beazley's Python Cookbook после поиска менее «серьезного» подхода, чем с использованием sys. IMO, более pythonic и понятным даже для новых пользователей.

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. 
+0

Получение ошибки с помощью этого метода (с использованием Python 2.7) Traceback (самый последний вызов последним): Файл "./pipetome.py", линия 4, в с fileinput.input() как f_input: AttributeError: Экземпляр FileInput не имеет атрибута '__exit__' –

+0

Выше было протестировано только в Python3 - возможно, вместо 'with' try' f_input = fileinput.input() '? – nlsdfnbch

Смежные вопросы