2010-03-23 24 views
10

tôi đã được sử dụng điều này như một tài liệu tham khảo, nhưng không có khả năng để thực hiện chính xác những gì tôi cần: Calling an external command in PythonQuá trình nền không đồng bộ trong Python?

Tôi cũng đã đọc bài viết này: http://www.python.org/dev/peps/pep-3145/

Đối với dự án của chúng tôi, chúng tôi có 5 Thanh toán svn rằng cần phải cập nhật trước khi chúng tôi có thể triển khai ứng dụng của mình. Trong môi trường dev của tôi, nơi triển khai nhanh chóng quan trọng hơn một chút đối với năng suất hơn là triển khai sản xuất, tôi đã và đang làm việc để đẩy nhanh quá trình.

Tôi có tập lệnh bash đã hoạt động một cách rõ ràng nhưng có một số hạn chế. Tôi kích hoạt nhiều cập nhật 'svn' bằng lệnh bash sau:

(svn update /repo1) & (svn update /repo2) & (svn update /repo3) & 

Tất cả đều chạy song song và hoạt động khá tốt. Tôi cũng sử dụng mẫu này trong phần còn lại của kịch bản xây dựng để kích hoạt từng kiến ​​tạo kiến, sau đó di chuyển các cuộc chiến tranh tới Tomcat.

Tuy nhiên, tôi không kiểm soát việc ngừng triển khai nếu một trong các bản cập nhật hoặc bản dựng không thành công.

Tôi đang viết lại tập lệnh bash của mình bằng Python để tôi có quyền kiểm soát nhiều hơn đối với các chi nhánh và quy trình triển khai.

Tôi đang sử dụng subprocess.call() để kích hoạt các lệnh 'svn update/repo', nhưng mỗi lệnh sẽ hoạt động tuần tự. Tôi thử '(svn update/repo) &' và tất cả những thứ đó đều tắt, nhưng mã kết quả sẽ trả về ngay lập tức. Vì vậy, tôi không có cách nào để xác định xem một lệnh cụ thể có bị lỗi hay không trong chế độ không đồng bộ.

import subprocess 

subprocess.call('svn update /repo1', shell=True) 
subprocess.call('svn update /repo2', shell=True) 
subprocess.call('svn update /repo3', shell=True) 

Tôi muốn tìm cách để Python kích hoạt từng lệnh Unix và nếu có bất kỳ cuộc gọi nào bị lỗi bất kỳ lúc nào toàn bộ tập lệnh dừng lại.

Trả lời

18

Không sử dụng shell=True. Nó sẽ không cần thiết gọi vỏ để gọi chương trình svn của bạn, và điều đó sẽ cung cấp cho bạn mã trả về của shell thay vì svn.

repos = ['/repo1', '/repo2', '/repo3'] 
# launch 3 async calls: 
procs = [subprocess.Popen(['svn', 'update', repo]) for repo in repos] 
# wait. 
for proc in procs: 
    proc.wait() 
# check for results: 
if any(proc.returncode != 0 for proc in procs): 
    print 'Something failed' 
+2

Đó chỉ là những gì tôi đang tìm kiếm. – Geuis

+1

Cảm ơn bạn, nó hoạt động. Có cách nào để chạy subprocess trong nền - bây giờ hiển thị trong thiết bị đầu cuối? (hiện tại tôi thấy mở shell với lệnh làm việc) –

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