2013-08-14 55 views
29

Tôi đã viết một tập lệnh bằng python cần một vài tệp, chạy một vài thử nghiệm và đếm số lượng total_bugs trong khi viết tệp mới với thông tin cho mỗi (lỗi + khác).Cách tốt nhất để trả lại giá trị từ tập lệnh python

Để mất một vài tập tin từ thư mục làm việc hiện tại:

myscript.py -i input_name1 input_name2

Khi công việc đó được thực hiện, tôi muốn kịch bản để 'total_bugs trở lại' nhưng tôi không chắc chắn về cách tốt nhất để thực hiện điều này.

Hiện tại, kịch bản in thứ như:

[working directory] 
[files being opened] 
[completed work for file a + num_of_bugs_for_a] 
[completed work for file b + num_of_bugs_for_b] 
... 
[work complete] 

Một chút giúp đỡ (ghi chú/lời khuyên/code ví dụ) có thể là hữu ích ở đây.

Btw, điều này cần phải làm việc cho các cửa sổ và hợp nhất.

+5

Nói chung, một ý tưởng tồi là cố gắng sử dụng giá trị trả lại của tệp thực thi để trả về bất kỳ điều gì ngoài mã lỗi hoặc 0 để thành công. Bạn sẽ làm gì với giá trị này khi nó được trả về? – geoffspear

+1

Không biết về cửa sổ, nhưng trong linux, nó là phổ biến cho các chương trình để xuất kết quả để stdout. Nó có vẻ như bình thường kịch bản của bạn in một loạt các thông tin, nhưng có lẽ với một lá cờ khác nhau (có thể c cho đếm?), Nó chỉ in tổng số các tập tin, ví dụ myscript.py -c -i input_name1 input_name2 – arghbleargh

+0

@ Wooble, đó là một tập lệnh để tìm lỗi trong các tệp báo cáo. Giá trị cho phép ước tính mức độ hiệu quả của các tệp báo cáo. –

Trả lời

63

Nếu bạn muốn kịch bản của bạn trở giá trị, chỉ cần làm return [1,2,3] từ một hàm gói mã của bạn nhưng sau đó bạn sẽ phải nhập khẩu kịch bản của bạn từ kịch bản khác để thậm chí có sử dụng bất kỳ thông tin rằng:

giá trị trả về (từ một gói chức năng)

(một lần nữa, điều này sẽ phải được điều hành bởi một kịch bản Python riêng biệt và được nhập khẩu để thậm chí làm bất kỳ tốt):

import ... 
def main(): 
    # calculate stuff 
    return [1,2,3] 

Mã thoát là chỉ số

(Điều này thường chỉ tốt khi bạn muốn cho biết thống đốc điều gì đã xảy ra hoặc chỉ đơn giản là số lượng lỗi/hàng được tính hoặc w/e. Thông thường 0 là một lối ra tốt và> = 1 là một lối xấu nhưng bạn có thể liên làm mất thì giờ chúng trong bất kỳ cách nào bạn muốn lấy dữ liệu ra khỏi nó)

import sys 
# calculate and stuff 
sys.exit(100) 

Và lối ra với một mã thoát cụ thể tùy thuộc vào những gì bạn muốn nói với thống đốc của bạn. Tôi đã sử dụng mã thoát khi chạy tập lệnh bằng môi trường lập lịch và theo dõi để cho biết điều gì đã xảy ra.

stdout như tiếp sức của bạn

Nếu không bạn sẽ phải sử dụng stdout để giao tiếp với thế giới bên ngoài (như bạn đã mô tả). Nhưng đó thường là một ý tưởng tồi trừ khi đó là một trình phân tích cú pháp thực thi tập lệnh của bạn và có thể nắm bắt bất kỳ điều gì bạn đang báo cáo.

import sys 
# calculate stuff 
sys.stdout.write('Bugs: 5|Other: 10\n') 
sys.stdout.flush() 
sys.exit(0) 

Bạn có đang chạy tập lệnh trong môi trường lập lịch được kiểm soát không, sau đó thoát mã là cách tốt nhất để thực hiện.

Các tệp làm băng chuyền

Ngoài ra còn có tùy chọn viết thông tin đơn giản vào một tệp và lưu trữ kết quả ở đó.

# calculate 
with open('finish.txt', 'wb') as fh: 
    fh.write(str(5)+'\n') 

Và nhận giá trị/kết quả từ đó.Bạn thậm chí có thể làm điều đó trong một định dạng CSV cho người khác để đọc đơn giản.

+0

Bỏ phiếu xuống là gì? o0 – Torxed

+1

Nó không phải từ tôi, nhưng tôi đoán đó là gợi ý os._exit() thay vì sys.exit(). Xem http://docs.python.org/2/library/os.html#os._exit – rodion

+0

Điểm tốt, tôi chỉ được sử dụng để viết '_exit()' rất nhiều lần trong các ứng dụng luồng của tôi mà tôi nghĩ rằng nó là không Không phải là một vấn đề lớn: S – Torxed