【问题标题】:Is there a Python equivalent to the 'which' command [duplicate]是否有与“which”命令等效的 Python [重复]
【发布时间】:2012-04-10 06:31:04
【问题描述】:

换句话说,有没有一种跨平台的方法可以知道subprocess.Popen(file)会在不先执行的情况下执行哪个文件?

【问题讨论】:

标签: python shell operating-system


【解决方案1】:

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。

【讨论】:

【解决方案2】:

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) 只是尝试在“路径”中列出的目录中查找“可执行文件”。如果“路径”为None,则默认为os.environ['PATH']。如果未找到,则返回“可执行文件”或 None 的完整路径。

请记住,与which 不同,find_executable 实际上并不检查结果是否标记为可执行。如果您想确定subprocess.Popen 能够执行该文件,您可能需要致电os.access(path, os.X_OK) 自行检查。


另外值得注意的是,Python 3.3+ 的shutil.which 已通过第 3 方模块 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'

【讨论】:

  • 避免使用 distutils,因为它使用了已弃用的 imp 会产生运行时警告。
【解决方案3】:

我相信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'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    • 2014-08-05
    • 2013-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多