2012-05-02 32 views
8

Tôi đang sử dụng Python để tự động hóa một cam kết SVN, và tôi muốn viết đầu ra của lệnh SVN vào một tệp nhật ký. Mã mà tôi có thể làm cho SVN chạy, nhưng vấn đề là trên một cam kết thành công, lời gọi subprocess không trả lại bất kỳ đầu ra nào cho nhật ký của tôi.Khi sử dụng subprocess.Popen(), stderr và stdout không có đầu ra

Khi tôi chạy SVN theo cách thủ công, bằng cách so sánh, tôi nhận được kết quả đầu ra cho biết tiến trình của lệnh và hiển thị tệp nào đang được cam kết. Đó là những gì tôi muốn trong tệp nhật ký của mình. SVN có xuất dữ liệu đó vào bộ đệm hơn stdout hay stderr không? Làm thế nào tôi có thể nắm bắt dữ liệu đó cho nhật ký của mình?

Dưới đây là đoạn code tôi đang sử dụng:

cmd = "svn commit --non-interactive --no-auth-cache -m 'Automatic commit' ./" 
process = subprocess.Popen(cmd, 
          shell=True, 
          stdout=subprocess.PIPE, 
          stderr=subprocess.PIPE, 
          universal_newlines=True) 
result = process.wait() 

# Output 
out = process.stdout.read() 
err = process.stderr.read() 

Khi tôi chạy mã này và cam kết thành công, outerr biến đều trống rỗng.

+0

Làm thế nào để bạn gửi thông tin đăng nhập để làm điều đó? Tôi đang cố gắng như vậy và không thể tìm ra cách gửi tên người dùng và mật khẩu cho cùng một –

Trả lời

9

Không sử dụng wait() khi bạn đang sử dụng PIPE. Sử dụng giao tiếp()

process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, 
      stderr=subprocess.PIPE, universal_newlines=True) 

out, err = process.communicate() 

Từ subprocess docs:

Cảnh báo
Sử dụng giao tiếp() chứ không phải là .stdin.write, .stdout.read hoặc .stderr.read để tránh bế tắc do bất kỳ ống hệ điều hành nào khác bộ đệm điền và chặn quá trình con.

0

Đó là làm việc trong dung dịch của tôi:

svn_commit_t = 'svn commit "%s" -m "ticket #%s automerge"' % (directory, tic) 

svn_co = subprocess.Popen(svn_commit_t, shell=True, stdout=subprocess.PIPE,stderr=subprocess.PIPE, universal_newlines=True) 

out, err = svn_co.communicate() 
Các vấn đề liên quan