0

Windows 7 用の Python 3 プログラムを作成して、CD 上のインストール実行可能ファイルの共通名を検索して実行します。複数の os.path.exists を使用してみましたが、正しいファイルが見つかると、他の可能なファイル名が見つからないことが出力されます。助けてください!

        if os.path.exists("D:/autorun.exe"):
            os.startfile("D:/autorun.exe")
        else:
            print("Failed Attempt!")
        if os.path.exists("D:/Install.exe"):
            os.startfile("D:/Install.exe")
        else:
            print("Failed Attempt!")
        if os.path.exists("D:/AutoRun.exe"):
            os.startfile("D:/AutoRun.exe")
        else:
            print("Failed Attempt!")
        if os.path.exists("D:/install.exe"):
            os.startfile("D:/install.exe")
        else:
            print("Failed Attempt!")
4

1 に答える 1

0

コードが同じインデント レベルにあるように見えるため、if/elseブロックのそれぞれが次々に実行されるため、「Failed Attempt!」と出力されます。存在しない各ファイルパスに対して。3 月 12 日のコメントを考えると、forループの後にif/elseブロックを使用して、「試行の失敗」を確実にすることができます。すべてのファイルの存在がチェックされた場合にのみ出力されます。以下のコードを参照してください (注: Windows 7 を手元に持っていないため、これをテストしていませんが、動作するはずです):

import os
FILES = ('D:/autorun.exe', 'D:/Install.exe', 'D:/AutoRun.exe', 'D:/install.exe')
FILE_FOUND = False

for file in FILES:
    if os.path.exists(file):
        FILE_FOUND = file
        break

if FILE_FOUND:
    os.startfile(FILE_FOUND)
else:
    print("Failed Attempt!")

したがって、段階的に分解するには:

  1. モジュールをインポートしosます。これは、明らかに他の場所で既に行っています。

  2. チェックする各ファイルのファイルパスは、タプルとして に保存されFILESます。タプルは「不変」であるため使用されます。したがって、上記のように正確に保存されることがわかっています。これは、for ループが各ファイルを左から右の順にチェックすることを意味するため、便利です。

  3. FILE_FOUNDとして最初に割り当てられFalseます。これは後で次の 2 つの目的で使用されます。

    • からのファイルのファイルパス文字列を保存しますFILES(存在する場合)。
    • を実行する必要があるかどうかを判断するために使用しos.startfile()ます。
  4. 次はforループです。タプル内の各ファイルパス文字列は、FILES次のインデントされたコードによってチェックできるようになりますfor file in FILES:。変数は からのfile現在のファイルパスを表す文字列で、ループFILESに関連付けられたコードに対してローカルです。for次に、ループは、指定されたファイルパス文字列にファイルが存在するかどうかを確認しますfile。ファイルが存在する場合、 にFILE_FOUND格納されている文字列が割り当てられますfile。その後、このbreakステートメントは、チェックされていないforアイテムを考慮せずにループを終了します。FILESそれ以外の場合、forチェックインする項目がなくなるまでループが実行され続けますFILES

  5. 最後に、if/elseコード ブロックは、forループが存在するファイルを検出するか、FILES. ( 、、、またはpython docsではないため) と評価FILE_FOUNDされた場合は、既存のファイルのファイルパス文字列が以前にループによって格納されていることがわかっている場合に実行されます。ファイルパス文字列がループ内に存在しないことが判明した場合でも、変数は のままであるため、「Failed Attempt!」と出力されます。TrueNone0Falseos.startfile(FILE_FOUND)FILE_FOUNDforforFILE_FOUNDFalse

于 2014-04-19T16:01:33.837 に答える