twn*_*ale 12 python windows console windows-console pythonw
如果我将我的代码文件保存为.pyw,则不会出现控制台窗口 - 这就是我想要的 - 但如果代码包含调用os.system,我仍然会得到一个讨厌的控制台窗口.我认为这是由呼叫引起的os.system.有没有办法从我的.pyw脚本中执行其他文件而根本不提高控制台窗口?
Pio*_*ost 15
您应该使用subprocess.Popen类传递作为带有属性保持标志和属性保持标志startupinfo的subprocess.STARTUPINFO类的参数值实例.这可以从读取线来推断866-868的源代码.可能还需要将flag作为参数值传递,因为您运行时不会打开控制台.dwFlagssubprocess.STARTF_USESHOWWINDOWwShowWindowsubprocess.SW_HIDEsubprocess.pysubprocess.CREATE_NEW_CONSOLEcreationflagspythonw.exe
当你使用shell=True它时,恰好正确地设置了上述所有内容,但这并不意味着它是一个合适的解决方案.我认为这不是因为它增加了运行命令解释器和解析参数的开销.另外,您应该记住,在根据子进程模块的文档从外部输入构造命令字符串的情况下,强烈建议不要使用shell = True.
Fra*_*mas 13
Piotr描述的解决方案实际上并不像听起来那么复杂.下面是一个示例,其中a startupinfo传递给check_call调用以抑制控制台窗口:
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
subprocess.check_call(cmd, startupinfo=startupinfo)
Run Code Online (Sandbox Code Playgroud)
由于方便功能call,check_call并将check_output它们转发**kwargs给Popen构造函数,因此不需要Popen直接使用.
小智 7
人们有点懒惰......我会感谢@Piotr Dobrogost和@Frank S. Thomas的答案.
我带来了这个在Linux和Windows上运行的代码:
import platform
import subprocess
startupinfo = None
if platform.system() == 'Windows':
import _subprocess # @bug with python 2.7 ?
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= _subprocess.STARTF_USESHOWWINDOW
startupinfo.wShowWindow = _subprocess.SW_HIDE
Run Code Online (Sandbox Code Playgroud)
后来...
args = [exe, ...]
out = subprocess.check_output(args, startupinfo=startupinfo)
Run Code Online (Sandbox Code Playgroud)
大家好;)
另外:请注意,使用'call'的以下代码也可以在Python 2.7(在Windows上)上使用上面的'startupinfo'代码:
def run_command(cmd, sin, sout):
print "Running cmd : %s"%(" ".join(cmd) )
return subprocess.call( cmd, stdin=sin, stdout=sout, startupinfo=startupinfo)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7776 次 |
| 最近记录: |