换句话说,是否有一种跨平台的方式可以在不先执行的情况下知道subprocess.Popen(file)
将执行哪个文件?
答案 0 :(得分:30)
Python 3.3添加了shutil.which()
以提供发现可执行文件的跨平台方法:
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。
答案 1 :(得分:13)
Python 2和3的选项:
from distutils.spawn import find_executable
find_executable('python') # '/usr/bin/python'
find_executable('does_not_exist') # None
find_executable(executable, path=None)
只是试图找到可执行的'在'路径'中列出的目录中。如果'路径'默认为os.environ['PATH']
是None
。返回“可执行文件”的完整路径。或None
如果没有找到。
请注意,与which
不同,find_executable
实际上并未检查结果是否已标记为可执行。如果您想确定os.access(path, os.X_OK)
能够执行该文件,您可以致电subprocess.Popen
自行检查。
另外值得注意的是,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'
答案 2 :(得分:10)
我相信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'