2017-01-30 1 views
2

私は、ローカルでPythonスクリプトを実行していて、f = urllib.urlopen()を使用してサーバーに照会し、いくつかのパラメーターを渡す状況があります。サーバ側のPHPスクリプトは、passthru()コマンドを使用してパラメータを受け取り、チェックし、実行可能ファイルに渡します。実行可能ファイルが実行され、出力はクライアントに戻され、response = f.read()を使用して読み取られます。応答が印刷されます。サーバーサイドの.exeからPHPをローカルPythonにストリーム

これは機能しますが、出力は処理の最後に大きなブロックで返されます。私がしたいのは、pythonターミナルでオンライン実行可能ファイルの出力をローカルに実行することです。誰もがここに行く良いアプローチを知っていますか?私はfor line in f: print lineを試しましたが、これは以前と同じ動作をします。

+1

あなたが紅潮したことがありますか? http://stackoverflow.com/questions/230751/how-to-flush-output-of-python-print –

+2

PHPスクリプトのように聞こえますが、1つの大きなブロックのデータを一度に出力にダンプすると、そうではありませんより良いPHPスクリプトを変更するには? – Alex

+0

Webブラウザ経由でURLにアクセスすると、サーバーはコマンド出力をストリームしますか? PHPスクリプトが出力する前にすべての出力を収集する場合は、PHPスクリプトを修正する必要があります。しかし、既にデータをストリームしている場合は、以下の答えを使ってストリームデータを処理することができます。 –

答えて

1

documentation for urllibは、「size引数を省略するか負の値を指定した場合、read()メソッドはデータストリームの終わりまで読み込むことができないため、ソケットからのストリーム全体に一般的なケースで読まれました。

だから、このように、一度に一つの文字を処理してみてください:

line = '' 
while True: 
    char = f.read(1) 
    if not char: 
     break 
    elif char == '\n': 
     print line 
     line = '' 
    else: 
     line += char 

# or a tidier form based on 
# http://bob.ippoli.to/archives/2005/06/14/python-iterators-and-sentinel-values/ 
line = '' 
for char in iter(lambda: f.read(1), ''): 
    if char == '\n': 
     print line 
     line = '' 
    else: 
     line += char 
+0

PythonとPHPスクリプトの両方を変更する必要がありましたが、これはPython側で機能しました。 PHPスクリプトでは、パススルーの代わりにpopenを使用するように変更し、バッファリングを強制しなくてはなりませんでした:http://stackoverflow.com/questions/20107147/php-reading-shell-exec-live-output – user1026739

関連する問題