2013-07-10 60 views
5

Tôi đã tự dạy mình python trong vài tháng qua và cuối cùng cũng bắt đầu làm một số việc hữu ích.Sử dụng python để phát lệnh nhắc

Điều tôi đang cố gắng làm cuối cùng là có một tập lệnh python hoạt động như một hàng đợi. Đó là, tôi muốn có một thư mục với một loạt các tập tin đầu vào mà một chương trình khác sử dụng để chạy các phép tính (Tôi là một nhà vật lý lý thuyết và thực hiện nhiều công việc tính toán một ngày).

Cách tôi phải thực hiện việc này ngay bây giờ là đặt tất cả các tệp đầu vào vào hộp có phần mềm tính toán. Sau đó, tôi phải chuyển đổi các tập tin đầu vào dos để unix (dos2unix), sau này tôi phải sao chép các tập tin đầu vào mới vào một tập tin gọi là 'INPUT'. Cuối cùng tôi chạy một lệnh khởi động công việc.

Tất cả các tác vụ này được xử lý trong dấu nhắc lệnh. Câu hỏi của tôi là làm thế nào để tôi giao diện chương trình của tôi với dấu nhắc lệnh? Sau đó, làm thế nào tôi có thể theo dõi quá trình (mà tôi thường làm thông qua việc sử dụng CPU và lệnh TOP), và có python bắt đầu công việc tiếp theo ngay sau khi công việc cuối cùng kết thúc.

Xin lỗi vì đã đánh bạc, tôi chỉ không biết cách kiểm soát lời nhắc lệnh từ tập lệnh và sau đó tự động 'xem' công việc.

Cảm ơn

+4

Tôi nghĩ mô-đun [subprocess] (http://docs.python.org/2/library/subprocess.html) là những gì bạn muốn. Đó là một câu hỏi hay, tôi sẽ cung cấp cho bạn điều đó, nhưng có rất nhiều [bản sao] (http://stackoverflow.com/q/89228/645270) của nó ở đây trên SO. – keyser

+0

Điều bạn đang thực sự yêu cầu — kiểm soát lời nhắc lệnh từ một tập lệnh — thật khó. Nhưng khi dấu nhắc lệnh bạn đang cố gắng kiểm soát (trong trường hợp này, shell) không làm bất cứ điều gì bạn không thể làm dễ dàng hơn trong Python (trong trường hợp này, với 'subprocess'), bạn không cần phải kiểm soát lời nhắc. – abarnert

Trả lời

6

Module subprocess có nhiều công cụ để thực hiện các lệnh hệ thống trong python.

from subprocess import call 
call(["ls", "-l"]) 

source

gọi sẽ chờ đợi lệnh để kết thúc và trở về mã trả của nó, vì vậy bạn có thể gọi một số khác sau khi biết rằng trước đó đã kết thúc.

os.system là một cách cũ để làm điều đó, nhưng có các công cụ ít hơn và không được khuyến khích:

import os 
os.system('"C:/Temp/a b c/Notepad.exe"') 

chỉnh sửa FVD left a comment giải thích rõ làm thế nào để "xem" quá trình dưới đây

+0

Và trong quá trình con bạn có thể sử dụng Popen.communicate (input = None) để "xem" công việc, khi OP đặt nó. – FvD

+0

Làm thế nào là 'os.system' dễ dàng hơn' subprocess.call'? Đó là cùng một số khái niệm (và về cùng số lần gõ phím) trong các trường hợp tầm thường và phức tạp hơn ngay khi có bất kỳ thứ gì khác xuất hiện (như đối số với dấu cách trong chúng). – abarnert

+0

Major deja vu từ bản sao mà tôi liên kết tới: p (với cuộc thảo luận của 'os.system') – keyser

1

Nếu bạn thực sự cần phải lái một giao diện dòng lệnh tương tác, không có cách nào để làm điều đó với stdlib.

Có một số tùy chọn của bên thứ ba cho việc này; Tôi nghĩ rằng pexpect có lẽ là phổ biến nhất.


Tuy nhiên, nếu bạn không thực sự cần phải lái xe nó tương tác-nếu chương trình chỉ cần bạn cung cấp cho nó đối số trên dòng lệnh, hoặc một "chế độ hàng loạt" đổ vào đầu vào tiêu chuẩn của nó, sau đó subprocess làm cho nó dễ dàng. Ví dụ, để lái xe chương trình sort, bạn chỉ có thể làm điều này:

with Popen(['sort', '-n'], stdin=PIPE, stdout=PIPE) as p: 
    sorted_data = p.communicate(input_data) 

Đây là khóa học một ví dụ ngớ ngẩn, bởi vì bạn có thể làm bất cứ điều gì sort có thể làm với Python của sorted với một cuộc tranh luận key, và có lẽ rất nhiều dễ đọc hơn.


Tổng quát hơn: thường khi bạn nghĩ bạn cần phải tương tác kịch bản một số chương trình, bạn thực sự không, và đôi khi bạn thậm chí không cần phải chạy nó ở tất cả.

Và trường hợp cụ thể của bạn chính xác là trường hợp như vậy. Bạn đang hỏi về cách tương tác kịch bản trình bao. Nhưng bạn không cần thực sự cần phải làm như vậy, bởi vì Python có thể làm tất cả những thứ bạn cần từ trình bao.