파이썬에서 실행 가능한 프로그램이 존재하는지 테스트하는 이식 가능하고 간단한 방법이 있습니까?
간단히 말해서 나는 which
완벽한 명령 과 같은 것을 의미합니다 . PATH를 수동으로 검색하거나 Popen
& al 을 사용하여 PATH를 실행 하고 실패하는지 확인하고 싶지 않습니다 (지금 내가하고있는 일이지만 상상해보십시오 launchmissiles
)
답변
내가 생각할 수있는 가장 쉬운 방법 :
def which(program):
import os
def is_exe(fpath):
return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
fpath, fname = os.path.split(program)
if fpath:
if is_exe(program):
return program
else:
for path in os.environ["PATH"].split(os.pathsep):
exe_file = os.path.join(path, program)
if is_exe(exe_file):
return exe_file
return None
편집 : 제공된 인수가 이미 실행 파일의 전체 경로 인 경우 (예 : “which / bin / ls”)를 처리하기위한 논리를 포함하도록 코드 샘플이 업데이트되었습니다. 이것은 UNIX ‘which’명령의 동작을 모방합니다.
편집 : 주석마다 os.path.exists () 대신 os.path.isfile ()을 사용하도록 업데이트되었습니다.
편집 : path.strip('"')
여기에 잘못한 것처럼 보입니다. Windows 나 POSIX 모두 인용 된 PATH 항목을 권장하지 않습니다.
답변
나는 이것이 고대의 질문이라는 것을 알고 있지만 사용할 수 있습니다 distutils.spawn.find_executable
. 이것은 python 2.4 이후 로 문서화 되었으며 python 1.6 이후로 존재했습니다.
import distutils.spawn
distutils.spawn.find_executable("notepad.exe")
또한 Python 3.3은 다음을 제공합니다. shutil.which()
.
답변
파이썬 3.3은 이제 shutil.which ()를 제공합니다 .
답변
파이썬 3.2 이하의 경우 :
my_command = 'ls'
any(os.access(os.path.join(path, my_command), os.X_OK) for path in os.environ["PATH"].split(os.pathsep))
이것은 Jay ‘s Answer의 한 줄짜리이며 람다 함수로도 사용됩니다.
cmd_exists = lambda x: any(os.access(os.path.join(path, x), os.X_OK) for path in os.environ["PATH"].split(os.pathsep))
cmd_exists('ls')
또는 마지막으로 함수로 들여 쓰기 :
def cmd_exists(cmd):
return any(
os.access(os.path.join(path, cmd), os.X_OK)
for path in os.environ["PATH"].split(os.pathsep)
)
파이썬 3.3 이상의 경우 :
import shutil
command = 'ls'
shutil.which(command) is not None
의 1 라이너로 월 – 필립 Gehrcke 응답 :
cmd_exists = lambda x: shutil.which(x) is not None
데프로서 :
def cmd_exists(cmd):
return shutil.which(cmd) is not None
답변
Windows에서 파일 확장자를 지정하십시오. 그렇지 않으면 환경 변수를 is_exe
사용하여 창에 훨씬 복잡한 것을 작성해야 PATHEXT
합니다. FindPath 만 사용하고 싶을 수도 있습니다 .
OTOH, 왜 실행 파일 검색을 귀찮게합니까? 운영 체제는 popen
호출의 일부로 사용자를 대신 하여 실행 파일을 찾지 못하면 예외를 발생시킵니다. 주어진 OS에 대해 올바른 예외를 잡기 만하면됩니다. Windows에서 찾을 수 없으면 subprocess.Popen(exe, shell=True)
자동으로 실패 exe
합니다.
(제이의 대답에서) PATHEXT
위의 구현에 통합 which
:
def which(program):
def is_exe(fpath):
return os.path.exists(fpath) and os.access(fpath, os.X_OK) and os.path.isfile(fpath)
def ext_candidates(fpath):
yield fpath
for ext in os.environ.get("PATHEXT", "").split(os.pathsep):
yield fpath + ext
fpath, fname = os.path.split(program)
if fpath:
if is_exe(program):
return program
else:
for path in os.environ["PATH"].split(os.pathsep):
exe_file = os.path.join(path, program)
for candidate in ext_candidates(exe_file):
if is_exe(candidate):
return candidate
return None
답변
* nix 플랫폼 (Linux 및 OS X)
이것은 나를 위해 일하는 것 같습니다 :
Mestreion 덕분에 Linux에서 작동하도록 편집
def cmd_exists(cmd):
return subprocess.call("type " + cmd, shell=True,
stdout=subprocess.PIPE, stderr=subprocess.PIPE) == 0
여기서하는 것은 내장 명령을 사용 type
하고 종료 코드를 확인하는 것입니다. 그러한 명령이 없다면type
1 (또는 0이 아닌 상태 코드)으로 종료됩니다.
stdout 및 stderr에 대한 비트 type
는 종료 상태 코드에만 관심이 있기 때문에 명령 출력을 침묵시키는 것 입니다.
사용법 예 :
>>> cmd_exists("jsmin")
True
>>> cmd_exists("cssmin")
False
>>> cmd_exists("ls")
True
>>> cmd_exists("dir")
False
>>> cmd_exists("node")
True
>>> cmd_exists("steam")
False
답변
경로 이름에 대한 유용한 기능 은 os.path 모듈을 참조하십시오 . 기존 파일이 실행 가능한지 확인하려면 os.X_OK 모드와 함께 os.access (path, mode) 를 사용하십시오.
os.X_OK
path를 실행할 수 있는지 판별하기 위해 access ()의 mode 매개 변수에 포함 할 값입니다.
편집 : 제안 된 which()
구현에는 os.path.join()
전체 파일 이름을 작성 하는 데 사용 되는 단서가 하나 없습니다 .
