2011-12-05 37 views
5

Tôi đang gặp sự cố khi thoát các cuộc gọi đến trình bao từ bên trong Python, bằng cách sử dụng lệnh os.system. Tôi đang cố gắng thực hiện tương đương:xử lý đúng cách thoát vỏ từ Python bằng os.system

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

từ bên trong Python, chuyển cho vỏ.

tôi đã cố gắng:

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

nhưng tôi nhận được lỗi:

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

mặc dù nó hoạt động một cách chính xác từ vỏ. Tôi đã cố gắng để thoát khỏi \t bằng cách thêm một dấu gạch chéo thêm trong Python, nhưng tôi phải thiếu cái gì khác. Bất kỳ ý tưởng làm thế nào điều này có thể được cố định?

cảm ơn.

+0

bạn có thể chuyển tên tệp thành arg để sắp xếp và bỏ qua tệp 'cat '| Chúc may mắn. – shellter

Trả lời

5

os.system không thực thi các lệnh trong môi trường bash bình thường như bạn mong đợi. Bạn có thể làm việc xung quanh nó bằng cách đơn giản gọi bash mình:

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

Nhưng bạn nên biết rằng os.system đã được đánh dấu là bị phản đối, và sẽ bị loại bỏ trong các phiên bản tương lai của python. Bạn có thể tương lai chứng minh mã của bạn bằng cách sử dụng subprocess 'phương pháp s tiện call bắt chước os.system' s hành vi:

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

Có nhiều cách để làm cho rằng cuộc gọi với các mô-đun subprocess nếu bạn quan tâm:

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

1

Trước tiên, bạn nên tránh vô dụng-sử dụng-mèo: http://google.com/search?q=uuoc.

Thứ hai, bạn có chắc chắn rằng lệnh sắp xếp của bạn không hiểu dấu gạch chéo ngược-t? Điều này sẽ làm việc:

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

Nó cũng nên làm việc tốt từ Python:

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

Cuối cùng, nếu bạn chuyển sang subprocess (recommended), tránh sử dụng shell=True:

subprocess.call(["sort", "--stable", "-t\t", "-k1,1", "test"]) 
Các vấn đề liên quan