2011-12-01 28 views
5

Tôi đang cố gắng loại bỏ một quy trình con không phải python và cho phép nó kế thừa stdin và stdout từ python. - tôi đang sử dụng subprocess.PopenPython - các quy trình con và vỏ trăn

Điều này có lẽ sẽ làm việc nếu tôi gọi từ một giao diện điều khiển, nhưng nó chắc chắn không hoạt động khi tôi đang sử dụng vỏ python

(Tôi đang sử dụng IDLE bằng cách này)

Có cách nào để thuyết phục python để cho phép một subthon không python để in nó stdout để vỏ python?

Trả lời

6

này hoạt động cả hai từ một kịch bản và từ người phiên dịch tương tác, nhưng không phải từ IDLE:

subprocess.Popen(whatever, stdin=sys.stdout, stdout=sys.stdin) 

Bạn không thể sử dụng các đối tượng mà IDLE gán để sys.stdinsys.stdout như các đối số để subprocess.Popen. Các đối tượng này (các giao diện cho cửa sổ trình bao IDLE) giống như tệp, nhưng chúng không phải là các tệp thực sự có thuộc tính fileno và các hệ điều hành giống Unix yêu cầu một fileno được chỉ định là stdin hoặc stdout cho một tiến trình con. Tôi không thể nói cho Windows, nhưng tôi tưởng tượng nó có những yêu cầu tương tự.

+0

Trên Windows IDLE chạy qua pythonw.exe, vì vậy nó không có bảng điều khiển 'stdin',' stdout' và 'stderr'. – eryksun

+0

nhưng có một cách để lừa python vào làm việc đó không? – dmjalund

4

Câu trả lời của Taymon giải quyết trực tiếp câu hỏi của bạn trong stdin/stdout của IDLE thực sự là các đối tượng giống như tệp và không phải luồng tệp chuẩn được kết hợp với bảng điều khiển/thiết bị đầu cuối. Hơn nữa, trong Windows IDLE chạy với pythonw.exe, mà thậm chí không có một giao diện điều khiển win32 kèm theo.

Điều đó nói rằng, nếu bạn chỉ cần đầu ra từ một chương trình được in cho người dùng trong thời gian thực, thì trong nhiều trường hợp (nhưng không phải tất cả) bạn có thể đọc dòng đầu ra theo dòng và lặp lại nó cho phù hợp. Các công trình sau đây cho tôi trong Windows IDLE. Nó thể hiện việc đọc từ một đường ống stdout theo đường thẳng. Nó cũng cho thấy những gì sẽ xảy ra nếu quá trình đệm đường ống, trong trường hợp này readline sẽ chặn cho đến khi bộ đệm đầy hoặc đường ống đóng. Việc đệm này có thể bị vô hiệu hóa bằng tay với một số chương trình (như tùy chọn -u của trình thông dịch Python), và có các cách giải quyết cho Unix như stdbuf.

test1.py

import sys 
import subprocess 

def test(cmd): 
    p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stdin=subprocess.PIPE, 
         stderr=subprocess.PIPE) 
    it = iter(p.stdout.readline, b'') 
    for line in it: 
     print(line.rstrip().decode('ascii')) 

print('Testing buffered subprocess...') 
test([sys.executable, 'test2.py']) 

print('\nTesting unbuffered subprocess...') 
#-u: unbuffered binary stdout and stderr 
test([sys.executable, '-u', 'test2.py']) 

test2.py:

import time 

for i in range(5): 
    print(i) 
    time.sleep(1) 

Sản lượng trong IDLE nên những điều sau đây, với tập đầu tiên của chữ số được in cùng một lúc sau khi một sự chậm trễ và thứ hai thiết lập dòng in theo dòng.

Testing buffered subprocess... 
0 
1 
2 
3 
4 

Testing unbuffered subprocess... 
0 
1 
2 
3 
4 
Các vấn đề liên quan