Nếu bạn muốn chạy các công cụ dòng lệnh dưới dạng các quy trình riêng biệt, chỉ cần sử dụng os.system
(hoặc tốt hơn: mô-đun subprocess
) để bắt đầu chúng không đồng bộ. Trên Unix/Linux/macos:
subprocess.call("command -flags arguments &", shell=True)
Trên Windows:
subprocess.call("start command -flags arguments", shell=True)
Đối biết khi nào một lệnh đã hoàn tất: Theo unix bạn có thể có được thiết lập với wait
vv, nhưng nếu bạn viết kịch bản lệnh, tôi chỉ muốn họ viết một tin nhắn vào một tập tin, và theo dõi tập tin từ tập lệnh python đang gọi.
@James Youngman đề xuất giải pháp cho câu hỏi thứ hai của bạn: Đồng bộ hóa. Nếu bạn muốn kiểm soát các quá trình của bạn từ python, bạn có thể bắt đầu chúng không đồng bộ với Popen.
p1 = subprocess.Popen("command1 -flags arguments")
p2 = subprocess.Popen("command2 -flags arguments")
Hãy cẩn thận nếu bạn sử dụng Popen và các quy trình của bạn ghi nhiều dữ liệu để xuất, chương trình của bạn sẽ bế tắc. Đảm bảo chuyển hướng tất cả đầu ra đến tệp nhật ký.
p1
và p2
là các đối tượng mà bạn có thể sử dụng để giữ các tab trên các quy trình của mình. p1.poll()
sẽ không chặn, nhưng sẽ trả về Không nếu quá trình này vẫn đang chạy. Nó sẽ trả về trạng thái thoát khi nó được thực hiện, vì vậy bạn có thể kiểm tra nếu nó là số không.
for proc in [p1, p2]:
time.sleep(60)
status = proc.poll()
if status == None:
continue
elif status == 0:
# harvest the answers
else:
print "command1 failed with status", status
Ở trên chỉ là một mô hình: Như được viết, nó sẽ không bao giờ thoát và sẽ giữ "thu hoạch" kết quả của quá trình hoàn tất. Nhưng tôi tin tưởng bạn có được ý tưởng.
Python có hỗ trợ tốt cho ['threading'] (http://docs.python.org/library/threading.html) và [' multiprocessing'] (http://docs.python.org/ library/multiprocessing.html). Vấn đề cụ thể mà bạn có với những vấn đề này là gì? –