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
Trả lời
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)
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
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. –
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
Đườ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ụ.
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.
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
- 1. Giữ công cụ dòng lệnh còn sống
- 2. JavaMail: Giữ IMAPFolder.idle() còn sống
- 3. Ổ cắm Python - giữ ổ cắm còn sống?
- 4. Python urllib2 với giữ sống
- 5. Giữ kết nối Java Bluetooth còn sống
- 6. Giữ một dịch vụ WCF còn sống dưới IIS
- 7. đẻ trứng và chờ đợi tiến trình con bằng Python
- 8. Bỏ qua (nghiêm trọng) các lỗi để giữ cho chương trình còn sống?
- 9. Đầu ra tiến trình tarfile của Python?
- 10. Sử dụng lại HttpURLConnection để giữ phiên còn sống
- 11. Nhận thông báo tiến bộ từ một tiến trình con
- 12. JSch: Làm thế nào để giữ cho phiên còn sống và lên
- 13. Python không thể giao tiếp với tiến trình con của máy chủ Minecraft
- 14. Làm cách nào để lưu tiến trình của chương trình và tiếp tục sau?
- 15. Shell ống với tiến trình con bằng Python
- 16. trình thông dịch python: ngắt và tiếp tục
- 17. Python - sử dụng tiến trình con để gọi sed?
- 18. thực hiện lệnh mèo trong tiến trình con, Popen() của python
- 19. Android - giữ cho dịch vụ còn sống ngay cả khi quá trình cha mẹ bị giết
- 20. Làm cách nào để giữ trình chỉnh sửa còn sống trong Virtualtreeview?
- 21. tạm dừng/tiếp tục tập lệnh python ở giữa
- 22. Đưa ra một số lệnh để xem trong MVVM
- 23. Giữ trình quản lý bền vững JDO còn sống thay vì đóng nó?
- 24. Sử dụng tiến trình con để chạy tập lệnh Python trên Windows
- 25. xử lý đầu ra liên tục của lệnh trong python
- 26. Tại sao việc sử dụng Object Initializer giữ một đối tượng còn sống?
- 27. lấy pid của tiến trình con
- 28. Làm thế nào để tách một tiến trình con sinh ra trong một kịch bản Node.js?
- 29. Tập lệnh để hiển thị tiến trình?
- 30. python: đọc đầu ra của tiến trình con trong các chủ đề
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