【问题标题】:How to find if a software is present with python [duplicate]如何使用python查找软件是否存在[重复]
【发布时间】:2018-02-05 17:35:51
【问题描述】:

我有一个 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是什么......)

【问题讨论】:

  • 32512 十六进制为 0x7F007F127,这是“找不到命令”的退出代码。我不知道为什么它会以这种方式呈现。
  • @PatrickHaugh 哇
  • 其实,我已经做了更多的调查,在the documentation 中有解释。退出状态指示为:“一个16位的数字,其低字节为杀死进程的信号号,其高字节为退出状态(如果信号号为零);低字节的高位为设置是否生成核心文件。"

标签: python


【解决方案1】:

就像 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 函数。

【讨论】:

    【解决方案2】:

    来自python docs关于os.system()

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-18
      • 2012-01-25
      • 2012-04-19
      • 2014-03-04
      • 1970-01-01
      • 2012-08-19
      • 2022-11-04
      相关资源
      最近更新 更多