如何查找python是否存在软件

时间:2018-02-05 17:35:52

标签: python

我有一个python代码,它使用os.system()调用gpg命令来解密某些文件,作为更大的文件管理管道的一部分。但是,在我的MacOS 10.11.6上,我有一个用于解密文件的gpg2版本。

所以我想在脚本中添加一些关于机器上是否存在gpg或gpg2的检查。

我尝试测试gpg的调用,并用以下方法捕获可能的OSError:

try:
    os.system("gpg --version")
except OSError:
    print("gpg not found")

但即使gpg不存在且os.system()来电的输出为:

,这也不起作用
sh: gpg: command not found
32512

我知道如何做到这一点?

(PS:我不知道32512是什么......)

2 个答案:

答案 0 :(得分:2)

就像os.system()文档已经告诉您的那样,我认为现在已超过10年了,请改用subprocess

>>> import subprocess
>>> subprocess.check_output(['gpg', '--version'])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/subprocess.py", line 629, in check_output
    **kwargs).stdout
  File "/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/subprocess.py", line 696, in run
    with Popen(*popenargs, **kwargs) as process:
  File "/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/subprocess.py", line 950, in __init__
    restore_signals, start_new_session)
  File "/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/subprocess.py", line 1544, in _execute_child
    raise child_exception_type(errno_num, err_msg)
FileNotFoundError: [Errno 2] No such file or directory: 'gpg'

在最近的Python版本中,您可能希望subprocess.run()优于有些笨重的遗留API函数。

答案 1 :(得分:1)

python docs关于os.system()

  

在子shell中执行命令(字符串)。这是通过调用标准C函数系统()来实现的,并且具有相同的限制。对sys.stdin等的更改不会反映在已执行命令的环境中。

所以这不是使用的命令。您应该使用现已弃用并由subprocess module替换的os.popen。

This answer是您正在寻找的有效例子。