2012-02-17 36 views
8

Nếu tôi sinh ra một mới subprocess trong python với một lệnh đã cho (giả sử tôi bắt đầu trình thông dịch python với lệnh python), làm thế nào tôi có thể gửi dữ liệu mới cho quá trình (qua STDIN)?Giữ một tiến trình con còn sống và tiếp tục đưa ra lệnh? Python

+1

nếu đó là một vỏ bạn muốn tự động tương tác với, 'pexpect' là rất tốt cho loại điều. – wim

Trả lời

8

Sử dụng mô-đun chuẩn subprocess. Bạn sử dụng subprocess.Popen() để bắt đầu quá trình và nó sẽ chạy trong nền (tức là cùng lúc với chương trình Python của bạn). Khi bạn gọi Popen(), bạn có thể muốn đặt tham số stdin, stdout và stderr thành subprocess.PIPE. Sau đó, bạn có thể sử dụng các trường stdin, stdout và stderr trên đối tượng được trả về để ghi và đọc dữ liệu.

chưa được kiểm tra mã ví dụ:

from subprocess import Popen, PIPE 

# Run "cat", which is a simple Linux program that prints it's input. 
process = Popen(['/bin/cat'], stdin=PIPE, stdout=PIPE) 
process.stdin.write(b'Hello\n') 
process.stdin.flush() 
print(repr(process.stdout.readline())) # Should print 'Hello\n' 
process.stdin.write(b'World\n') 
process.stdin.flush() 
print(repr(process.stdout.readline())) # Should print 'World\n' 

# "cat" will exit when you close stdin. (Not all programs do this!) 
process.stdin.close() 
print('Waiting for cat to exit') 
process.wait() 
print('cat finished with return code %d' % process.returncode) 
+0

Vì vậy, hãy nói rằng tôi cần một số quy trình chạy cùng một lúc. Có một ý tưởng tốt hơn để sinh ra rất nhiều quy trình con với 'Popen()', hay 'fork'? – n0pe

+1

Popen thực hiện quá trình xử lý. Nó chỉ là một câu hỏi liệu bạn có muốn tự mình làm cấp thấp hay không hoặc bạn muốn nó được gói trong một thư viện cấp cao hơn. Kết quả cuối cùng hoàn toàn giống nhau. –

+0

Vì vậy, một số Popens đồng thời sẽ không làm hỏng hệ thống? Cảm ơn, tôi sẽ thử. – n0pe

0

Đường hầm do Subprocess tạo ra để kích hoạt nhiều lệnh không thể được giữ nguyên. để đạt được điều này, bạn có thể xem xét paramiko, cho các công cụ khác như stdin phụ, stdout, stderr bạn có thể đi qua liên kết này python subprocess, vì đây là dự án python đầu tiên của bạn tốt hơn bạn nên đọc và thử công cụ.

3

Không.

Nếu bạn muốn gửi lệnh đến một tiến trình con, hãy tạo một pty và sau đó chia nhỏ tiến trình con với một đầu của pty gắn với STDIN của nó.

Dưới đây là một đoạn trích từ một số mã của tôi:

RNULL = open('/dev/null', 'r') 
WNULL = open('/dev/null', 'w') 

master, slave = pty.openpty() 
print parsedCmd 
self.subp = Popen(parsedCmd, shell=False, stdin=RNULL, 
         stdout=WNULL, stderr=slave) 

Trong mã này, pty được gắn vào thiết bị lỗi chuẩn vì nó nhận được thông báo lỗi hơn là gửi lệnh, nhưng nguyên tắc là như nhau.

+1

Không sử dụng pty.openpty() với quy trình con - quá phức tạp. Sử dụng subprocess.PIPE, và để cho các mô-đun subprocess chăm sóc nó cho bạn. (Cũng như đơn giản hơn và tiêu chuẩn hơn, điều đó sẽ sử dụng một đường ống có trọng lượng nhẹ hơn PTY). – user9876

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