Como evitar a janela do console com o arquivo .pyw que contém a chamada do Sistema?
-
21-09-2019 - |
Pergunta
Se eu salvar meus arquivos de código como .pyw
, nenhuma janela do console aparece - que é o que eu quero - mas se o código incluir uma chamada para os.system
, Eu ainda recebo uma janela de console irritante. Presumo que seja causado pela chamada para os.system
. Existe uma maneira de executar outros arquivos de dentro do meu .pyw
Script sem aumentar a janela do console?
Solução
Você pode tentar usar o subprocesso módulo (subprocess.Popen
, subprocess.call
ou o que seja) com o argumento shell=True
Se você deseja evitar o início de uma janela do console.
Outras dicas
Você deveria usar subprocess.Popen
classe passando como startupinfo
instância de valor do parâmetro de subprocess.STARTUPINFO
classe com dwFlags
atributo segurando subprocess.STARTF_USESHOWWINDOW
bandeira e wShowWindow
atributo segurando subprocess.SW_HIDE
bandeira. Isso pode ser inferido de linhas de leitura 866-868 do subprocess.py
Código fonte. Pode ser necessário passar também subprocess.CREATE_NEW_CONSOLE
bandeira como um valor de creationflags
Parâmetro enquanto você corre em pythonw.exe
que não abre um console.
Quando você usa shell=True
Acontece que tudo isso é definido corretamente, mas isso não significa que é uma solução adequada. Eu argumentaria que não é porque adiciona sobrecarga de interpretador de comando em execução e argumentos de análise. Além disso, você deve ter em mente que (...) o uso de shell = true é fortemente desencorajado Nos casos em que a sequência de comando é construída a partir de entrada externa De acordo com a documentação do módulo de subprocesso.
A solução que Piotr descreve não é tão complicada quanto parece. Aqui está um exemplo em que um startupinfo
é passado para um check_call
Invocação para suprimir a janela do console:
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
subprocess.check_call(cmd, startupinfo=startupinfo)
Desde as funções de conveniência call
, check_call
, e check_output
encaminhar seus **kwargs
para o Popen
construtor, não é necessário usar Popen
diretamente.
As pessoas são um pouco preguiçosas ... eu faria Thx @Piotr Dobrogost e @Frank S. Thomas para suas respostas.
Eu vim com este código que está correndo no Linux e no 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
Mais tarde...
args = [exe, ...]
out = subprocess.check_output(args, startupinfo=startupinfo)
Thx pessoal;)
Além disso: apenas para observar que o código a seguir usando 'chamada' também funciona no Python 2.7 (no Windows) com o código 'startupinfo' acima:
def run_command(cmd, sin, sout):
print "Running cmd : %s"%(" ".join(cmd) )
return subprocess.call( cmd, stdin=sin, stdout=sout, startupinfo=startupinfo)
Parece que o 'OS.Popen' não produz janela do console. O script está funcionando sob 'Pythonw'. Não tenho certeza sobre todos os casos, mas no meu caso funciona bem.
os.popen(command)
Semelhante a quê @em primeira mão Disse, eu li nos fóruns WXPython-User que você "substitui" o aplicativo atual em execução, que seria "command.com" ou "cmd.exe", com pyw.exe ou pythonw.exe quando você usa algo como a seguir:
os.execl(sys.executable, *([sys.executable]+sys.argv))
Vejo Outro post
Embora eu não saiba como você faria IO neste caso.
Acredito que um benefício dessa abordagem é se você executar seu script várias vezes na barra de tarefa do sistema operacional, com os ícones de CMD. Por outro lado, se você tiver vários CMD minimizados na barra de tarefas e comece a fechá -los, é impossível dizer qual CMD acompanha qual script Pythonw.