2012-08-07 38 views
5

Quá trình tạo các kịch bản Python của tôi hoạt động tốt với 'xargs' là gì? Ví dụ: tôi muốn lệnh sau đây hoạt động thông qua mỗi dòng tệp văn bản và thực thi một lệnh tùy ý:Làm cho các tập lệnh Python hoạt động với xargs

cat servers.txt | ./hardware.py -m 

Về cơ bản muốn mỗi dòng được chuyển đến tập lệnh hardware.py.

+2

Nội dung bạn hiển thị là * đầu vào tiêu chuẩn *, nhưng những gì bạn * hỏi * là 'xargs'. Chúng không giống nhau. Bạn muốn gì? – kojiro

+0

Có lý do cụ thể nào mà bạn không thể chỉ đọc trong tệp văn bản trong python không? – ciferkey

+0

Đường ống chỉ kết nối 'cat'' stdout' với hardware.py' stdin'. Vì vậy, trong hardware.py, bạn chỉ nên đọc dữ liệu từ 'stdin' (ví dụ: data = raw_input()). –

Trả lời

6

Để làm cho các lệnh của bạn hoạt động với xargs, bạn chỉ cần chúng chấp nhận đối số. Các đối số bằng Python nằm trong danh sách sys.argv. Bằng cách này bạn có thể thực hiện somthing như:

find . -type f -name '*.txt' -print0 | xargs -0 ./myscript.py 

mà có thể tương đương với

./myscript.py ./foo.txt ./biz/foobar.txt ./baz/yougettheidea.txt 

Để thực hiện lệnh của bạn làm việc với đầu vào tiêu chuẩn, bạn cũng có thể sử dụng các mô-đun sys, lần này với sys.stdin, mà bạn có thể xem như một tệp. Điều này giống như ví dụ bạn đã đưa ra:

./myscript.py < somefile.txt 
1

Bạn đang bối rối hai vấn đề.

Trước tiên, ứng dụng của bạn có thể nhận dữ liệu nhập từ stdin. Điều này không liên quan gì với xargs. Trong ví dụ của bạn, tất cả hardware.py cần phải làm là đọc sys.stdin như các tập tin đầu vào, ví dụ:

if __name__=='__main__': 
    for line in sys.stdin: 
     do_something(line) 

Nếu bạn muốn hardware.py để sản xuất ra các chương trình khác xuống dòng có thể sử dụng, chỉ cần viết để sys.stdout

Thứ hai, ứng dụng của bạn có thể nhận dữ liệu nhập từ các đối số. Đây là nơi bạn sẽ sử dụng xargs. Ví dụ:

xargs ./hardware.py < servers.txt # giống như cat servers.txt | xargs ./hardware.py

Điều này sẽ chuyển mỗi "từ" của servers.txt (không phải mọi dòng dòng) làm đối số cho hardware.py (có thể nhiều đối số cùng một lúc). Điều này sẽ giống như chạy hardware.py word1 word2 word3 word4 ...

Python lưu trữ đối số dòng lệnh trong mảng sys.arvg. sys.argv[0] sẽ là tên lệnh và sys.argv[1:] sẽ là tất cả các đối số dòng lệnh. Tuy nhiên, bạn thường xử lý tốt hơn dòng lệnh của mình bằng cách sử dụng argparse.

0

Nó không phải là khá rõ ràng những gì bạn muốn làm.Nếu ./hardware.py -m đọc một dòng từ đầu vào tiêu chuẩn, bạn có thể sử dụng GNU Song song với phân phối các dòng:

cat servers.txt | parallel --pipe -N1 ./hardware.py -m 

Nếu ./hardware.py -m mất một máy chủ duy nhất như là đối số bạn có thể làm:

cat servers.txt | parallel ./hardware.py -m 

Bạn có thể cài đặt GNU Parallel đơn giản bằng cách:

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel 
chmod 755 parallel 
cp parallel sem 

Xem video giới thiệu cho GNU Parallel để tìm hiểu thêm: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

Các vấn đề liên quan