我有一个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是什么......)
答案 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是您正在寻找的有效例子。