12

Python 2.5.2を使用して次のことに気づきました(2.7を使用しても発生しません)。

#!/usr/bin/python

import sys

for line in sys.stdin:
   print line,

出力:

$ echo -e "one\ntwo\nthree" | python test.py
$ one
$ two
$ three

予想通り。subprocessただし、このスクリプトにインポートすると、次のようになります。

#!/usr/bin/python

import sys
import subprocess

for line in sys.stdin:
   print line,

出力:

$ echo -e "one\ntwo\nthree" | python test.py
$ two
$ three

出力の最初の行はどうなりましたか?

アップデート:

問題の根本を発見したのではないかと思います。に名前の付いたファイルがありtime.pyましたcwdtime.pycインポートされたスクリプトを実行するたびにAが作成されており、これもインポートされているsubprocessことを示してい./time.pyます。.pycおよびtime.pyファイルを削除すると、スクリプトは正常に実行されます。subprocessしかし、なぜ輸入によって./time.pyも輸入されるのかという疑問がまだあります。

私はそれをさらに正確な線に絞り込み、それtime.pyが奇妙な振る舞いを引き起こします。作業ディレクトリとファイルの内容を、出力に影響するものだけに削除しました。

test.py

#!/usr/bin/python

import sys
import subprocess

for line in sys.stdin:
   print line,

time.py

#!/usr/bin/python

import sys

for line in sys.stdin:
   hour = re.search(r'\b([0-9]{2}):', line).group(1)

test.py任意の種類の入力で実行すると、出力の最初の行が省略さtime.pycれて作成されます。

4

2 に答える 2

1

グローバルタイムモジュールの代わりにローカルtime.pyがインポートされるようです。名前を変更するか、少なくともスクリプトとして実行されたか、モジュールとしてインポートされたかを確認することをお勧めします。

あなたがそれをテストしたいなら、これはあなたのためにそれを証明するでしょう。

#!/usr/bin/python

import sys

# Test that script was run directly
if __name__=='__main__':
    for line in sys.stdin:
       hour = re.search(r'\b([0-9]{2}):', line).group(1)
else:
    print 'Imported local time.py instead of global time module!'
    sys.exit(1)
于 2012-10-30T17:26:47.763 に答える
-2

print line,2.7より前は改行を出さなかったので、最初の行を上書きしました。カンマを失うと、結果は同じになります。

于 2012-10-29T15:34:04.070 に答える