Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 当引发异常时,如何停止CMD(从subprocess.popen)关闭?_Python_Windows_Error Handling_Subprocess_Popen - Fatal编程技术网

Python 当引发异常时,如何停止CMD(从subprocess.popen)关闭?

Python 当引发异常时,如何停止CMD(从subprocess.popen)关闭?,python,windows,error-handling,subprocess,popen,Python,Windows,Error Handling,Subprocess,Popen,我正在使用subprocess.popen使用给定的python文件生成多个CMD。最后都有一个input()。问题是如果代码中有任何引发的异常,窗口就会关闭,我看不到它发生了什么 无论哪种方式,我都希望它保持打开状态,不管发生什么错误。所以我可以看到它。或者在主窗口返回错误,就像此脚本由于此原因无法运行一样 我正在Windows上运行此操作: import sys import platform from subprocess import Popen,PIPE pipelines = [(

我正在使用
subprocess.popen
使用给定的python文件生成多个CMD。最后都有一个
input()
。问题是如果代码中有任何引发的异常,窗口就会关闭,我看不到它发生了什么

无论哪种方式,我都希望它保持打开状态,不管发生什么错误。所以我可以看到它。或者在主窗口返回错误,就像此脚本由于此原因无法运行一样

我正在Windows上运行此操作:

import sys
import platform
from subprocess import Popen,PIPE

pipelines = [("Name1","path1"),
         ("Name2","path2")]

# define a command that starts new terminal
if platform.system() == "Windows":
  new_window_command = "cmd.exe /c start".split()
else:  #XXX this can be made more portable
  new_window_command = "x-terminal-emulator -e".split()
processes = []
for i in range(len(pipelines)):
  # open new consoles, display messages
  echo = [sys.executable, "-c",
        "import sys; print(sys.argv[1]);  from {} import {}; obj = {}(); obj.run();  input('Press Enter..')".format(pipelines[i][1],pipelines[i][0],pipelines[i][0])]
  processes.append(Popen(new_window_command + echo + [pipelines[i][0]])) 

for proc in processes:    
  proc.wait()

若要查看错误,请尝试将所需的代码片段包装在
try
/
中,但

try:
    ...
except Exception as e:
    print(e)

这是个不错的主意,但我认为我无法在字符串中完成这一点。我要传递什么?获取新控制台的方法是使用选项
creationflags=subprocess.CREATE\u new\u console
,并直接运行命令,而不是通过
cmd.exe/c
。CMD的
start
命令不会等待并设置退出代码,默认情况下不会。通过组合
/w
选项和CMD的
退出
命令,可以使其工作,但它不值得,除非该命令仅通过
启动
工作。是的,这是有意义的。我可以将其更改为使用新的控制台标志,但是如何停止它以关闭,或者在主窗口上获取引发的异常?我看到,如果我打印出等待函数,我得到0或1,但是对于代码引发的异常,我得到了1,对于键盘中断,我得到了0。