Как выполнять команды оболочки из exe-файла на основе Python(tkinter)?

#python #python-3.x #tkinter #subprocess

Вопрос:

Я пытаюсь запустить некоторые команды оболочки из приложения Python на основе tkinter, используя следующий код:

 from tkinter import *
import subprocess

win = Tk()

def runScript():    
    result = subprocess.run(
        ["echo", "hello"], capture_output=True, text=True
    )
    outputLabel = Label(win, text=result.stdout)
    outputLabel.grid(row=1, column=0)
    

# Button 
submitButton = Button(win, text="Submit", command=runScript)
# Implementing 
submitButton.grid(row=0, column=0)

#Set the geometry of tkinter frame
win.geometry("250x250")

win.mainloop()
 

Команды выполняются нормально при запуске приложения py из оболочки.
Однако, когда exe-файл создается с помощью следующей команды pyinstaller --onefile -w filename.py , команды, похоже, не выполняются.

Комментарии:

1. так что же происходит вместо этого? также есть subprocess.getoutput()

Ответ №1:

subprocess это случай, когда-окно приводит к поломкам.

Вы должны явно перенаправить неиспользуемые stdin и stderr на значение NULL. Вы должны установить shell=True . Это используется, когда команда, которую вы хотите выполнить, встроена в оболочку.

 result = subprocess.run(["echo", "hello"],  text=True, shell=True, stdout=subprocess.PIPE, stdin=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
 

Теперь вы можете использовать pyinstaller --onefile -w filename.py

Вот вывод exe — файла сейчас:

Вывод исполняемого файла сейчас

Комментарии:

1. Похоже, это все еще не работает с --windowed операционной --noconsole . Работает без этих флагов, но открывает консоль в фоновом режиме при обработке.