Python3。提示需要ctrl + c并暂停脚本

时间:2015-11-26 10:16:44

标签: python-3.x subprocess

我正在编写一个运行在目录中的小脚本,并试图通过运行“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很陌生,我正在练习这个 - 所以任何指导都非常感谢。

全部谢谢!

2 个答案:

答案 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)