Tôi đang cố gắng tạo tập lệnh đang sử dụng mô-đun đa xử lý với python. Kịch bản lệnh (cho phép gọi nó là myscript.py) sẽ nhận được đầu vào từ một tập lệnh khác có đường ống.Có cách nào để vượt qua 'stdin' như là một đối số cho một quá trình trong python?
Giả sử rằng tôi gọi các tập lệnh như thế này;
$ python writer.py | python myscript.py
Và đây là mã;
// writer.py
import time, sys
def main():
while True:
print "test"
sys.stdout.flush()
time.sleep(1)
main()
//myscript.py
def get_input():
while True:
text = sys.stdin.readline()
print "hello " + text
time.sleep(3)
if __name__ == '__main__':
p1 = Process(target=get_input, args=())
p1.start()
điều này rõ ràng là không hoạt động, vì đối tượng sys.stdin khác với quy trình chính và p1. Vì vậy, tôi đã cố gắng giải quyết vấn đề này,
//myscript.py
def get_input(temp):
while True:
text = temp.readline()
print "hello " + text
time.sleep(3)
if __name__ == '__main__':
p1 = Process(target=get_input, args=(sys.stdin,))
p1.start()
nhưng tôi gặp phải lỗi này;
Process Process-1:
Traceback (most recent call last):
File "/usr/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
self.run()
File "/usr/lib/python2.7/multiprocessing/process.py", line 114, in run
self._target(*self._args, **self._kwargs)
File "in.py", line 12, in get_input
text = temp.readline()
ValueError: I/O operation on closed file
Vì vậy, tôi đoán rằng tệp stdin chính đã đóng và tôi không thể đọc từ tệp đó. Tại kết hợp này, làm thế nào tôi có thể chuyển tập tin stdin của chính vào một tiến trình khác? Nếu đi qua stdin là không thể, làm thế nào tôi có thể sử dụng stdin chính từ một quá trình khác?
cập nhật: OK, tôi cần làm rõ câu hỏi của mình vì mọi người nghĩ rằng việc sử dụng đa xử lý không thực sự cần thiết. xem xét myscript.py
như thế này;
//myscript.py
def get_input():
while True:
text = sys.stdin.readline()
print "hello " + text
time.sleep(3)
def do_more_things():
while True:
#// some code here
time.sleep(60*5)
if __name__ == '__main__':
p1 = Process(target=get_input, args=())
p1.start()
do_more_things()
vì vậy, tôi thực sự cần chạy hàm get_input() song song với hàm chính (hoặc các quy trình phụ khác). Xin lỗi vì những xung đột, tôi có tiếng Anh tốt, và tôi đoán tôi không thể rõ ràng về câu hỏi này. Tôi sẽ đánh giá cao nếu các bạn có thể cho tôi biết nếu tôi có thể sử dụng các quy trình chính đối tượng STDIN trong quá trình khác.
cảm ơn trước.
bạn có thể viết thư cho stdin sử dụng cú pháp tìm thấy ở đây http://stackoverflow.com/questions/ 8880461/python-subprocess-output-to-list-or-file/8880555 # 8880555 Ở đó nó được sử dụng để đọc nhưng bạn có thể sử dụng cùng một đối tượng –
Tại sao 'myscript.py' tạo một tiến trình con? Tại sao nó không chỉ đơn giản là đọc từ sys.stdin? Nếu nó đọc từ 'sys.stdin' thì script shell sẽ hoạt động hoàn hảo. Tại sao tạo một tiến trình con? –
Hi S.Lott, Đây chỉ là một nguyên mẫu của vấn đề của tôi, myscript.py chứa một quy trình khác có vòng lặp vô hạn và chạy như một daemon, vì vậy tôi không thể đọc nó trong quá trình chính myscript vì writer.py cũng vô hạn và cần được chạy như một daemon. @JohanLundberg, cảm ơn lời khuyên của bạn, tôi sẽ kiểm tra. –