0

Python に移植したい bash スニペットがあります。SVN の場所と、SVN が実行可能かどうかを検出します。

SVN=`which svn 2>&1` 
if [[ ! -x $SVN ]]; then
    echo "A subversion binary could not be found ($SVN)"        
fi

subprocess モジュールを使用した Python での現在の試みは次のとおりです。

SVN = Popen('which svn 2>&1', shell=True, stdout=PIPE).communicate()[0]
Popen("if [[ ! -x SVN ]]; then echo 'svn could not be found or executed'; fi", shell=True)

Python のローカル名前空間に SVN の場所が保存されているにもかかわらず、Popen からアクセスできないため、これは機能しません。

また、1 つの Popen オブジェクトに結合しようとしました。

Popen("if [[ ! -x 'which svn 2>&1']]; then echo 'svn could not be found'; fi", shell=True)

しかし、私はこのエラーを受け取ります(言うまでもなく、非常に扱いにくいようです)

/bin/sh: -c: line 0: syntax error near `;'
/bin/sh: -c: line 0: `if [[ ! -x 'which svn 2>&1']]; then echo 'svn could not be found'; fi'

テスト構文「-x」の Python バージョンはありますか? それが理想だと思います。他の回避策も同様に高く評価されます。

ありがとう

4

3 に答える 3

4

これが最も簡単な解決策です。

path_to_svn = shutil.which('svn')
is_executable = os.access(path_to_svn, os.X_OK)

shutil.whichPython 3.3 の新機能です。この回答にはポリフィルがあります。必要に応じてパスを取得することもできPopenますが、必須ではありません。

そして、ここに のドキュメントがありos.accessます。

于 2013-03-11T07:27:09.583 に答える
1
SVN = Popen('which svn 2>&1', shell=True, stdout=PIPE).communicate()[0]
str="if [[ ! -x " + SVN + " ]]; then echo 'svn could not be found or executed'; fi"
Popen(str, shell=True)
于 2013-03-11T07:22:33.773 に答える
1

which を使用する必要はありません。パラメーターなしで svn を実行することを既に試みることができます。それが機能する場合は、そこにあることを意味します。

try:
    SVN = subprocess.Popen('svn')
    SVN.wait()
    print "svn exists"
except OSError:
    print "svn does not exist"
于 2013-03-11T07:35:25.397 に答える