あなたの名前を尋ねて、それを吐き出す簡単な Python スクリプトがあります。
def main():
print('Enter your name: ')
for line in sys.stdin:
print 'You entered: ' + line
かなりシンプルなもの!これを OS X ターミナルで実行すると、うまく機能します。
$ python nameTest.py
Enter your name:
Craig^D
You entered: Craig
NSTask
ただし、このプロセスを 経由で実行しようとすると、追加の flush() 呼び出しが Python スクリプトに追加された場合にのみ stdout が表示されます。
これは、私NSTask
とパイプの設定方法です:
NSTask *_currentTask = [[NSTask alloc] init];
_currentTask.launchPath = @"/usr/bin/python";
_currentTask.arguments = [NSArray arrayWithObject:@"nameTest.py"];
NSPipe *pipe = [[NSPipe alloc] init];
_currentTask.standardOutput = pipe;
_currentTask.standardError = pipe;
dispatch_queue_t stdout_queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
__block dispatch_block_t checkBlock;
checkBlock = ^{
NSData *readData = [[pipe fileHandleForReading] availableData];
NSString *consoleOutput = [[NSString alloc] initWithData:readData encoding:NSUTF8StringEncoding];
dispatch_sync(dispatch_get_main_queue(), ^{
[self.consoleView appendString:consoleOutput];
});
if ([_currentTask isRunning]) {
[NSThread sleepForTimeInterval:0.1];
checkBlock();
} else {
dispatch_sync(dispatch_get_main_queue(), ^{
NSData *readData = [[pipe fileHandleForReading] readDataToEndOfFile];
NSString *consoleOutput = [[NSString alloc] initWithData:readData encoding:NSUTF8StringEncoding];
[self.consoleView appendString:consoleOutput];
});
}
};
dispatch_async(stdout_queue, checkBlock);
[_currentTask launch];
しかし、 を実行するNSTask
と、次のように表示されます (最初は空白ですが、自分の名前を入力して CTRL+D を押すと、すべてが一度に終了します)。
Craig^DEnter your name:
You entered: Craig
だから、私の質問は次のとおりです。Python スクリプトに追加の flush() ステートメントを必要とせずに、どのようにstdout
my からを読み取ることができますか? として実行すると、 Enter your name:プロンプトがすぐに表示されないNSTask
のはなぜですか?NSTask