Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.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 使用os.system()或SUBSPROCESS.call()时,如何隐藏控制台?_Python_Windows_Console_Subprocess - Fatal编程技术网

Python 使用os.system()或SUBSPROCESS.call()时,如何隐藏控制台?

Python 使用os.system()或SUBSPROCESS.call()时,如何隐藏控制台?,python,windows,console,subprocess,Python,Windows,Console,Subprocess,我写了一些陈述如下: os.system(cmd) #do something subprocess.call('taskkill /F /IM exename.exe') 两者都会弹出一个控制台 如何阻止它弹出控制台?尝试子进程。Popen([“函数”、“选项1”、“选项2”],shell=False)进程启动信息可以隐藏控制台窗口: si=subprocess.STARTUPINFO() si.dwFlags |=subprocess.STARTF_USESHOWWINDOW #si.wS

我写了一些陈述如下:

os.system(cmd) #do something
subprocess.call('taskkill /F /IM exename.exe')
两者都会弹出一个控制台


如何阻止它弹出控制台?

尝试
子进程。Popen([“函数”、“选项1”、“选项2”],shell=False)
进程
启动信息
可以隐藏控制台窗口:

si=subprocess.STARTUPINFO()
si.dwFlags |=subprocess.STARTF_USESHOWWINDOW
#si.wShowWindow=subprocess.SW#u HIDE#默认值
子进程调用('taskkill/F/IM exename.exe',startupinfo=si)
或设置创建标志以禁用创建窗口:

CREATE_NO_WINDOW = 0x08000000
subprocess.call('taskkill /F /IM exename.exe', creationflags=CREATE_NO_WINDOW)
以上仍然是一个控制台进程,具有控制台I/O的有效句柄(通过对
GetStdHandle
返回的句柄调用
GetFileType
进行验证)。它没有窗口,也不继承父控制台(如果有的话)

通过强制孩子完全没有控制台,您可以更进一步:

DETACHED_PROCESS = 0x00000008
subprocess.call('taskkill /F /IM exename.exe', creationflags=DETACHED_PROCESS)

在这种情况下,子进程的标准句柄(即
GetStdHandle
)为0,但您可以将它们设置为打开的磁盘文件或管道,例如
subprocess.DEVNULL
(3.3)或
subprocess.pipe

shell=True
参数添加到子流程调用中

subprocess.call('taskkill /F /IM exename.exe', shell=True)
或者,如果不需要等待,请使用
subprocess.Popen
而不是
subprocess.call

subprocess.Popen('taskkill /F /IM exename.exe', shell=True)

尝试将扩展名从.py更改为.pyw


它基本上只是一个Python用户界面文件。因此,它打开了一个没有命令行的新窗口。选中此链接(filext.com/file extension/PYW)

只需添加:

subprocess.call('powershell.exe taskkill/F/IM exename.exe',shell=True)

尝试改用
spawn
系列。相关:抱歉,subprocess.Popen无法运行我要调用的内容,因为异常引发了“无效的win32应用程序”。但是os.system可以在没有任何警告的情况下运行它;我可以在Windows7上运行它,本机运行(Python 2.7.2),也可以在Cygwin(Python 2.6.5)下运行,没有任何警告。另外,
shell
参数默认为
False
。显式地传递它应该不会有什么区别。当然,startupinfo技术是有效的,但这一个比较短(但在其中添加一条注释,说明为什么要使用
shell=True
,否则它可能不会那么明显)。嗯,出于某种原因,我的可执行文件在使用
shell=True
时没有运行。但当使用startupinfo时,它运行得很好。@arifwn:请发布一个新问题。+1以简洁起见。这种方式有子流程。请注意,通过
cmd/c
运行只能与受信任的命令一起使用。在这种情况下没关系。不是一个好的解决方案。shell=True做的比您想要的更多,如果用户可以操作输入,则会带来安全问题。
creationflags=CREATE\u NO\u WINDOW
似乎不是很好portable@Cyan,从什么意义上讲,
CREATE\u NO\u WINDOW
不可移植?这是一个Windows问题,从3.1到Windows 10的所有Windows NT版本都应该支持这些标志。据我所知,Python 3.7现在有@Harmon758。正在添加优先级类创建标志,我建议我们也可以添加一些其他标志,包括控制台标志
CREATE\u NO\u WINDOW
DETACHED\u PROCESS
以及另外两个与控制台无关的标志--
CREATE\u breakout\u FROM\u JOB
CREATE\u DEFAULT\u ERROR\u MODE
@eryksun我的道歉,我并不是想暗示你还没有意识到它的存在。我还没有看到这里提到的,所以我想向任何遇到这个问题的人提供信息,因为这个答案对它有很高的可见性。嗨,请提供一些额外的叙述来解释这个问题是如何回答的。谢谢。它基本上只是一个Python用户界面文件。因此,它打开了一个没有命令行的新窗口。选中此链接()请编辑实际答案以包含此有用信息,谢谢。这仍然无法回答有关在已运行的Python应用程序(无论是否在控制台窗口中运行)中使用subprocess()调用的问题。