我正在编写一个运行在目录中的小脚本,并试图通过运行“filename --version”来获取版本号。现在,在大多数情况下,它以可管理的方式工作或失败。但是我在/ sbin /中遇到一个文件“iptables-restore”,当传递了--version时它失败了。但是,失败会使提示处于需要ctrl + z或ctrl + c返回提示的状态,从而暂停我的脚本。
以下是代码:
try:
subOut = subprocess.check_output([fname, "--version"])
except subprocess.CalledProcessError as cpE:
fObj.write('{0:25}RETURN CODE:{1:15}\t\t{2:30}\n'.format(fnamecolon, cpE.returncode, cpE.output))
fnamecolon = ''
pass
except Exception as e:
pass
我只是想知道是否有一种优雅的方式来处理这个 - 通过返回代码或可能是异常。
我对Python很陌生,我正在练习这个 - 所以任何指导都非常感谢。
全部谢谢!
答案 0 :(得分:0)
所以这样做效果更好 - 可能还有一些我不理解的事情......
try:
# devnull=open(os.devnull, 'w')
try:
from subprocess import DEVNULL # Python 3
except ImportError:
DEVNULL = open(os.devnull, 'r+b', 0)
subOut = Popen([fname, "--version"], stdin=DEVNULL, stdout=PIPE, stderr=STDOUT, close_fds=True)
output = subOut.stdout.read()
except subprocess.CalledProcessError as cpE:
fObj.write('{0:25}RETURN CODE:{1:15}\t\t{2:30}\n'.format(fnamecolon, cpE.returncode, cpE.output))
fname = ''
pass
except Exception as e:
# fObj.write('{0:30}{1:30}{2:30}\n'.format(fname, e.returncode, e.output))
pass
答案 1 :(得分:0)
我可以重现它:iptables-restore --version
命令在没有stdin=subprocess.DEVNULL
suggested by @mata的情况下等待输入:
#!/usr/bin/env python3
import subprocess
cp = subprocess.run(['iptables-restore', '--version'],
stdin=subprocess.DEVNULL,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
print(cp.returncode, cp.stdout, cp.stderr)