2012-06-19 7 views
18

Chcę uruchomić komendę mysql i ustawić jej wynik jako zmienną w skrypcie Pythona.Dane wyjściowe potoków z polecenia powłoki do skryptu Pythona

Oto polecenie powłoki próbuję uruchomić:

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

Oto skrypt Pythona:

#!/usr/bin/env python 

import sys 

def hello(variable): 
    print variable 

Jak bym przyjąć zmienna w skrypcie Pythona i mieć ramę wyjście?

Odpowiedz

19

Należy odczytać ze standardowego wejścia, aby pobrać dane ze skryptu Pythona, np.

#!/usr/bin/env python 

import sys 

def hello(variable): 
    print variable 

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

Jeśli wszystko chcesz zrobić tutaj jest chwycić niektóre dane z bazy danych MySQL i następnie manipulować go z Python chciałbym przejść rurociągów go do skryptu i wystarczy użyć the Python MySql module zrobić zapytanie SQL.

+0

+1 za sugerowanie mysql-python. – abarnert

9

Po podłączeniu wyjścia jednego polecenia do skryptu pytho, przechodzi do sys.stdin. Możesz czytać z sys.stdin tak jak plik. Przykład:

import sys 

print sys.stdin.read() 

Ten program dosłownie wydaje swoje wejście.

+1

+1 dla wspomnieć „podobnie jak w pliku”, które, miejmy nadzieję, prowadzących do realizacji OP może też robić takie rzeczy jak „dla line in sys.stdin: ", itp. – abarnert

16

Jeśli chcesz skrypt zachowywać się podobnie jak wiele narzędzi wiersza poleceń systemu UNIX i przyjmuję rury lub nazwę pliku jako pierwszy argument, można użyć następujących:

#!/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

Ponieważ ta odpowiedź wyskakuje w Google u górny przy wyszukiwaniu piping data to a python script, chciałbym dodać inną metodę, którą znalazłem w J. Beazley's Python Cookbook po wyszukaniu mniej "gritty" aproach niż przy użyciu sys. IMO, bardziej pytonowo i nie wymaga wyjaśnienia nawet dla nowych użytkowników.

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

To podejście działa również dla komend strukturyzowanych tak:

$ 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

otrzymuję błąd przy użyciu tej metody (przy użyciu Pythona 2.7) Traceback (najnowsza połączeń ostatni): pliku "./pipetome.py", wiersz 4, w z fileinput.input() jako f_input: AttributeError: Instancja FileInput nie ma atrybutu "__exit__" –

+0

Powyższe zostało przetestowane tylko w Python3 - może zamiast 'with' spróbuj' f_input = fileinput.input() '? – nlsdfnbch

Powiązane problemy