2

いくつかのプログラムをコンパイルして出力をフォルダーに入れるスクリプトがあります。スクリプトには、フォルダー内のすべての実行可能ファイルを反復して検索し、それらをリストに追加する関数があります。

def _oswalkthrough(direc,filelist=[]):
    dirList=os.listdir(direc)
    for item in dirList:
        filepath = direc+os.sep+item
        if os.path.isdir(filepath):
            filelist = _oswalkthrough(filepath,filelist)
        else:
            if ".exe" == item[-4:]:
                filelist.append(filepath)
    return filelist

これはWindowsでは問題なく動作しますが、これをMacで実行すると動作しません。もちろん、Macでコンパイルされたファイルは「.exe」で終わっていないため、ifステートメントは役に立ちません、コンパイルされたファイルの名前を含むリストを作成し、スクリプトを次のように変更しましたが、まだ結果が得られません。「.o」ファイルを含むすべてのファイルが追加されます。私はexeが欲しいだけですか?(Mac で何と呼ばれているかわかりません!)。

def _oswalkthrough(direc,filelist=[]):
    dirList=os.listdir(direc)
    for item in dirList:
        filepath = direc+os.sep+item
        if os.path.isdir(filepath):
            filelist = _oswalkthrough(filepath,filelist)
        else:
            for file in def_scons_exe:
                if file == item[-4:]:
                    filelist.append(filepath)
    return filelist
4

4 に答える 4

2

まず第一に、あなたのコードは Mac では動作しません。たとえば、条件if file == item[-4:]が機能しないためです.o(長さが異なり、同じになることはありません)。

もう 1 つのこととして、os.walk関数を見てみましょう (これにより、パス トラバースのスペースが節約されます)。

もう 1 つの問題は、拡張子を確認しても、ファイルが実行可能であることを保証しないことです。os.access を使用してファイルアクセスモードを確認することをお勧めします。あなたの場合(実行可能かどうかを知りたい場合)、os.X_OKフラグを確認する必要があります。チェック用のコードスニペットは次のとおりです。

import os

if os.access("/path/to/file.o", os.X_OK):
    print 'Executable!'
于 2012-08-16T12:59:15.847 に答える
1

os.access を使用して、Mac、Linux、および Windows でも確認できます。

def _oswalkthrough(direc,filelist=[]):
    dirList=os.listdir(direc)
    for item in dirList:
        filepath = os.path.join(direc,item)
        if os.path.isdir(filepath):
            filelist.extend(_oswalkthrough(filepath))
        elif os.access(filepath, os.X_OK):
            filelist.append(filepath)
    return filelist

私はいくつかのバグ修正を行い、物事をよりPythonicに変えました。

于 2012-08-16T12:54:26.507 に答える
0

セクションのように見えます:

for file in def_scons_exe:
    if file == item[-4:]:
        filelist.append(filepath)

する必要があります:

for file in def_scons_exe:
    if file == item[-len(file):]:
        filelist.append(filepath)
        break

この変更により、プログラムは4文字だけでなく、任意の長さの拡張子を検索します。また、一致する拡張機能が見つかると、拡張機能の検索を停止します。

また、このos.walk関数を使用してコードを簡略化しos.access([path], os.X_OK)、実行権限をテストする必要があります。

于 2012-08-16T12:54:42.980 に答える
0

Mac での答えは、Windows よりも難しいです。Windows のデフォルトのバイナリ拡張子は exe です。Mac には同等のものはありません。バイナリ ファイル タイプがあります。それらは、従来、Mac の exe と比較できるものです。彼らは多くの場所に住んでいます。/usr/bin でそれらのかなりの部分を見ることができます。

バイナリ ファイル タイプがファイル アクセス モードをチェックするかどうかをチェックするには、次のようにします。

is_executable = os.access(path, os.X_OK) 

ただし、実行可能と言うときは、アプリ フォルダーについて話している可能性もあります。これは、Mac では、Windows ユーザーが伝統的に exe として考えているものです。ほとんどのアプリ フォルダーは /Applications にあります。

次のようにアプリ フォルダのリストを取得できます。

import os

appfolder = [name for name in os.listdir(".") if os.path.isdir(name) and name.endswith('.app')]
于 2012-08-16T13:10:01.767 に答える