2012-03-26 10 views
11

別の言い方をすれば、最初に実行しないで、どのファイルがsubprocess.Popen(file)によって実行されるのかを知るプラットフォームがありますか?'which'コマンドに相当するPythonはありますか

+2

https://github.com/amoffat/pbs/blob/master/pbs.py#L95 –

+0

、サブプロセスは親プロセスの環境をinherents。したがって、PATH(または該当するOSのOS)内の実行可能ファイルの場合は、その場所を指定する必要はありません。 –

+0

@JoshLeeはPBSがもう利用できないように見えます。 – Joe

答えて

8

私は、Python 3.3は、実行可能ファイルを発見するクロスプラットフォームの手段を提供するshutil.which()を追加Pythonライブラリ

>>> def which(pgm): 
    path=os.getenv('PATH') 
    for p in path.split(os.path.pathsep): 
     p=os.path.join(p,pgm) 
     if os.path.exists(p) and os.access(p,os.X_OK): 
      return p 


>>> os.which=which 
>>> os.which('ls.exe') 
'C:\\GNUwin32\\bin\\ls.exe' 
24

で何も存在しないと信じて:

http://docs.python.org/3.3/library/shutil.html#shutil.which

戻るへのパス指定されたcmdが呼び出された場合に実行される実行可能ファイル。 cmdが呼び出されない場合はNoneを返します。

サンプルコール:

>>> shutil.which("python") 
'/usr/local/bin/python' 

>>> shutil.which("python") 
'C:\\Python33\\python.EXE' 

残念ながら、これは2.7.x.にバックポートされていませんPythonの2と3のための

+2

バージョン3.3でのshutilの実装のためのPythonソースはここにあります(数十行のみ):http:// hgあなたが1110行目を 'もしあれば(pat.htのextのための[cmd.lower().endswith(ext.lower())]に変更したならば、' .python.org/cpython/file/6860263c05b3/Lib/shutil.py#l1068 – joemaller

+1

) '(ジェネレータをリストに変換します)、Python 2.7で動作するよりも優れています。 – cdhagmann

+2

バックポート:https://github.com/mbr/shutilwhich –

7

オプション:

from distutils.spawn import find_executable 

find_executable('python') # '/usr/bin/python' 

find_executable('does_not_exist') # None 

find_executable(executable, path=None)は単に 'パス' に記載されているディレクトリに '実行' を見つけようとします。 'path'がNoneの場合、デフォルトはos.environ['PATH']になります。実行可能ファイルへの完全なパスを返します。見つからない場合はNoneを返します。

whichとは異なり、find_executableは結果が実行可能とマークされていることを実際にチェックしません。 subprocess.Popenがファイルを実行できることを確実にしたいかどうかを確認するには、os.access(path, os.X_OK)に電話してください。


またノートの

、Pythonの3.3+のshutil.whichは、サードパーティモジュールwhichcraftを経由してバックポートとPython 2.6、2.7のために利用できるように、および3.xされています。

上記のGitHubページ(pip install git+https://github.com/pydanny/whichcraft.git)またはPythonパッケージインデックス(pip install whichcraft)からインストールできます。それは、このようなように使用することができます:デフォルトでは

from whichcraft import which 

which('wget') # '/usr/bin/wget' 
関連する問題