2011-12-05 10 views
5

Mam problemy z prawidłowym usuwaniem wywołań do powłoki z poziomu Pythona za pomocą komendy os.system. Próbuję wykonać odpowiednik:Właściwa obsługa powłoki uciekającej z Pythona przy użyciu os.system

$ cat test | sort --stable -t $'\t' -k1,1 

z poziomu Pythona, przekazując go do powłoki.

Próbowałem:

import os 
cmd = "cat %s | sort --stable -t $'\\t' -k1,1" %("test") 
os.system(cmd) 

ale pojawia się błąd:

sort: multi-character tab `$\\t' 

chociaż działa prawidłowo z powłoki. Próbowałem uciec z \t, dodając dodatkowe cięcie w języku Python, ale brakuje mi czegoś innego. Masz pomysł, jak to naprawić?

dzięki.

+0

co możliwe przekazuj nazwę pliku jako argument do sortowania i pomiń "plik cat |". Powodzenia. – shellter

Odpowiedz

5

os.system nie wykonuje poleceń w normalnym środowisku bash, jak można się spodziewać. Można to obejść, po prostu dzwoniąc bash siebie:

import os 
cmd = """/bin/bash -c "cat %s | sort --stable -t $'\t' -k1,1" """ % "test" 
os.system(cmd) 

Ale trzeba mieć świadomość, że os.system została oznaczona jako przestarzała i zostanie usunięta w przyszłych wersjach Pythona. Można przyszłościowe kod za pomocą subprocess „metody s wygoda call który naśladuje os.system” s zachowanie:

import subprocess 
cmd = """/bin/bash -c "cat %s | sort --stable -t $'\t' -k1,1" """ % "test" 
subprocess.call(cmd, shell=True) 

Istnieje więcej sposobów, aby to połączenie za pomocą modułu subprocess Jeśli jesteś zainteresowany:

http://docs.python.org/library/subprocess.html#module-subprocess

1

Po pierwsze, należy unikać niepotrzebnego używania kota: http://google.com/search?q=uuoc.

Po drugie, czy jesteś pewien, że twoje polecenie sortowania nie rozumie backslash-t? To powinno działać:

sort --stable -t'\t' -k1,1 test 

Należy również działać dobrze z Pythona:

os.system("sort --stable -t'\\t' -k1,1 test") 
# or 
os.system(r"sort --stable -t'\t' -k1,1 test") 

Wreszcie, po przełączeniu do subprocess (zalecane), należy unikać używania shell=True:

subprocess.call(["sort", "--stable", "-t\t", "-k1,1", "test"]) 
Powiązane problemy