#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
. Работает без этих флагов, но открывает консоль в фоновом режиме при обработке.