2017-12-12 42 views
1

なぜコンテンツPythonのos.system:コマンドの順序

import os 
print('Hi') 
os.system('cat a.py') 

でファイルa.pyを呼び出すんが、次のような出力が得られ、どのように私は彼らが正しい順序で印刷するように得ることができますか?あなたはprintがする前にcatコマンドのプリントがstdoutにいることがわかり

$ python a.py 
import os 
print('Hi') 
os.system('cat a.py') 
Hi 

。 Windows上のGitBashでPython 3.6を実行したときに発生します。ではないは、Ubuntu 17.10でPython 3.6で発生します。


注:私は簡単にfile.readlines()のようなものを使用してファイルの内容を印刷周り得ることができることを承知しています。これは単純な例です。しかし、より複雑なものを実行する場合、を理解することが重要になる可能性があります。これが起こり、回避する方法

+0

なぜサブプロセスを使用していませんか? 'os.system'は使用しないでください。 'subprocess.Popen'の動作はすべてのOSで同じであることが保証されています – user1767754

+0

@ user1767754:サブプロセスの動作は何が違うのですか。 – user2357112

答えて

7

出力がバッファされます。このバッファをフラッシュする必要があります。

import os 
import sys 
print('Hi') 
sys.stdout.flush() 
os.system('cat a.py') 
+0

バッファリングされていないのに 'python -u'を呼び出すことができませんでしたか? – user1767754

+0

また、フラッシュしないでUbuntuで動作する理由を説明できますか? – Michael

+1

通常、stdoutが端末に接続されていると、出力はラインバッファーになります(したがって、ラインターミネーターによって 'Hi'出力が自動的にフラッシュされます)。しかし、Git Bashが変更する可能性があります。 – user2357112

0

これは、よりクリーンな方法です。

from subprocess import check_output 
print check_output(['cat', 'a.py']) 
+0

それは何も変わらないでしょう。 – user2357112

+0

これは同じ結果をもたらすと言っていますか? – user1767754

+0

何らかの理由でPythonスクリプトの出力バッファリングで何かをしない限り、 'os.system'コードと同じ結果が得られます。 – user2357112