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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top