0

私は別の「壁」にぶつかりました...次のスクリプトがあります。これはWindowsで正常に機能しているように見えますが、Linuxに移動すると機能が失われるようです。

注:トラブルシューティングのために、印刷行のステートメントを追加しました。

次のスクリプトは、IのときにhostsFileの内容を出力し、Iのときにprint lines各行を順番に出力しprint lineます。ただし、pingの実行に達すると、ファイル内の最後のホストに直接ジャンプしているように見えます。私は明らかに明らかな何かを見逃したのではないかと思っていました(私はまだ初心者としてPythonを学んでいます)。

import sys, os, platform, subprocess

plat = platform.system()
scriptDir = sys.path[0]
hosts = os.path.join(scriptDir,'hosts.txt')
hostsFile = open(hosts, "r")
lines = hostsFile.readlines()
print lines
if plat == "Windows":
        for line in lines:
                line = line.strip( )
                ping = subprocess.Popen(
                        ["ping", "-n", "1", "-l", "1", "-w", "100", line],
                        stdout = subprocess.PIPE,
                        stderr = subprocess.PIPE
                )
        out, error = ping.communicate()
        print out
        print error

elif plat == "Linux":
        for line in lines:
                print line
                line = line.strip()
                ping = subprocess.Popen(
                        ["ping", "-c", "1", "-s", "1", "-l", "1",line],
                        stdout = subprocess.PIPE,
                        stderr = subprocess.PIPE
                )
        out, error = ping.communicate()
        print out
        print error

hostsFile.close()

任意の考え/助けをいただければ幸いです。

よろしくお願いします。

よろしく、

MHibbin

編集:助けてくれたWoobleに感謝します...正しいコードは次のようになります(間隔に注意してください):

import sys, os, platform, subprocess

plat = platform.system()
scriptDir = sys.path[0]
hosts = os.path.join(scriptDir,'hosts.txt')
hostsFile = open(hosts, "r")
lines = hostsFile.readlines()
if plat == "Windows":
        for line in lines:
                line = line.strip( )
                ping = subprocess.Popen(
                        ["ping", "-n", "1", "-l", "1", "-w", "100", line],
                        stdout = subprocess.PIPE,
                        stderr = subprocess.PIPE
                )
                out, error = ping.communicate()
                print out
                print error

if plat == "Linux":
        for line in lines:
                line = line.strip()
                ping = subprocess.Popen(
                        ["ping", "-c", "1", line],
                        stdout = subprocess.PIPE,
                        stderr = subprocess.PIPE
                )
                out, error = ping.communicate()
                print out
                print error

hostsFile.close()
4

3 に答える 3

1

示されているように、このコードはWindowsまたはLinuxでは機能しません。ping.communicate()をループ内に移動する必要があります。そうしないと、ループが完了した後にのみ実行されます。

forループは次のようになります。

for line in lines:
    print line
    line = line.strip()
    ping = subprocess.Popen(
                ["ping", "-c", "1", "-s", "1", "-l", "1",line],
                stdout = subprocess.PIPE,
                stderr = subprocess.PIPE
          )
    out, error = ping.communicate()
    print out
于 2012-05-17T11:39:31.630 に答える
0

for問題は、ループの後で1回だけ通信を呼び出していることです。スクリプトのその時点で、変数pingはループからのサブプロセスへの最後の呼び出しを参照します。

空の「hosts.txt」ファイルでそれを体験できます。一度もループに入らないため、NameErrorが発生します。NameError: name 'ping' is not defined

あなたはそれをループの中で呼ぶべきです!

更新:例:

for line in lines:
    print line
    line = line.strip()
    ping = subprocess.Popen(
        ["ping", "-c", "1", "-s", "1", "-l", "1",line],
        stdout = subprocess.PIPE,
        stderr = subprocess.PIPE
    )
    out, error = ping.communicate()
    print "out:", out
    print "error:", error
于 2012-05-17T11:38:30.690 に答える
0

私はこれがあなたが求めているものだと信じています:

import sys, os, platform, subprocess

plat = platform.system()
scriptDir = sys.path[0]
hosts = os.path.join(scriptDir,'hosts.txt')
hostsFile = open(hosts, "r")
lines = hostsFile.readlines()
print lines
if plat == "Windows":
        for line in lines:
                line = line.strip( )
                ping = subprocess.Popen(
                        ["ping", "-n", "1", "-l", "1", "-w", "100", line],
                        stdout = subprocess.PIPE,
                        stderr = subprocess.PIPE
                )
                out, error = ping.communicate()
                print out
                print error

elif plat == "Linux":
        for line in lines:
                print line
                line = line.strip()
                ping = subprocess.Popen(
                        ["ping", "-c", "1", "-s", "1", "-l", "1",line],
                        stdout = subprocess.PIPE,
                        stderr = subprocess.PIPE
                )
                out, error = ping.communicate()
                print out
                print error

hostsFile.close()

印刷ステートメントのインデントが増えていることに注意してください。これは、forループに含まれている必要があります。私は自分のマシンでこれを試したところ、hosts.txtの各結果のpingが出力されています-これはあなたが望んでいたものだと思いますか?

于 2012-05-17T11:42:27.027 に答える