Joe*_*Joe 19 python shell operating-system
换句话说,是否有一种跨平台的方式来知道哪个文件将在subprocess.Popen(file)不首先执行的情况下执行?
joe*_*ler 32
添加shutil.which()了Python 3.3 以提供发现可执行文件的跨平台方法:
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'
Run Code Online (Sandbox Code Playgroud)
不幸的是,这还没有被移植到2.7.x.
Six*_*Six 15
Python 2和3的一个选项:
from distutils.spawn import find_executable
find_executable('python') # '/usr/bin/python'
find_executable('does_not_exist') # None
Run Code Online (Sandbox Code Playgroud)
find_executable(executable, path=None)只是试图在'path'中列出的目录中找到'可执行文件'.默认为os.environ['PATH']'path' None.返回"可执行"的完整路径或未None找到.
请记住,与实际上不一样which,find_executable不会检查结果是否标记为可执行文件.os.access(path, os.X_OK)如果您想确定subprocess.Popen能够执行该文件,您可能需要打电话来自行检查.
另外值得注意的是,shutil.whichPython中的3.3+已经被移植,并通过第三方模块为Python 2.6,2.7,和3.x提供whichcraft.
它可以通过前面提到的GitHub页面(即pip install git+https://github.com/pydanny/whichcraft.git)或Python包索引(即pip install whichcraft)进行安装.它可以像这样使用:
from whichcraft import which
which('wget') # '/usr/bin/wget'
Run Code Online (Sandbox Code Playgroud)
Abh*_*jit 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'
Run Code Online (Sandbox Code Playgroud)