Использование команд CMD с исполняемым скриптом Python - PullRequest
0 голосов
/ 03 января 2019

После написания приведенного ниже сценария (который работает отлично), я открываю приглашение Windows cmd.exe и набираю следующее

pyinstaller -F --windowed myscript.py

, который дает мне файл с именем "myscript.exe".

Проблема в том, что когда я открываю исполняемый файл и нажимаю кнопку, ничего не происходит. Я думаю, что есть проблема с этой строкой:

check_output("shutdown -s -t 60", shell=True)  

Хотя скрипт работает «как скрипт», он не работает как исполняемый файл.
Я пробовал другой синтаксис, такой как

os.system("shutdown -s -t 60") 

но они, похоже, не работают.

from tkinter import *
from subprocess import check_output,CalledProcessError

class main_gui:
    def __init__(self,master):
        self.master=master
        master.geometry("250x100")
        self.button1=Button(self.master,
                            text="Press me",
                            font="Times 10 bold",
                            command=self.shutdown)
        self.button1.pack()

    def shutdown(self):
        try:
            check_output("shutdown -s -t 60", shell=True)
            print("Computer will shutdown in 60 seconds")
        except CalledProcessError:
            print("Already pressed")

root = Tk()
my_gui = main_gui(root)
root.mainloop()

Что я могу сделать?

1 Ответ

0 голосов
/ 03 января 2019

Что вы можете сделать:

с помощью:

import subprocess
subprocess.call(["shutdown", "-f", "-s", "-t", "60"])

это будет работать. с --windowed

Похоже, проблема в check_output с флагом --windowed: /

Edit1:

на основе eryksun комментариев. Также были результаты моих исследований, но теперь это кажется доказательством.

Используйте check_call и флаг создания, чтобы избежать создания окна консоли. Например: CREATE_NO_WINDOW = 0x08000000; check_call('shutdown -s -t 60', creationflags=CREATE_NO_WINDOW).

Относительно check_output, поскольку он переопределяет stdout, Popen также должен дублировать наследуемые копии существующих дескрипторов stdin и stderr. Это не удастся, если они недействительны. При запуске из консоли в Windows 7 графический интерфейс может наследовать недопустимые стандартные дескрипторы. Обходной путь должен переопределить все 3 ручки. Например: output = check_output('shutdown -s -t 60', stdin=subprocess.DEVNULL, stderr=subprocess.DEVNULL, creationflags=CREATE_NO_WINDOW

Edit2:

Вы также можете добавить иконку напрямую с помощью pyinstaller ...
Справка: Специальные опции для Windows и Mac OS X

...