Как избежать консольного окна.pyw файл, содержащий ОС.системный вызов?

если я сохраню свои файлы кода как .pyw, окно консоли не появляется - это то, что я хочу - но если код включает вызов os.system, Я все еще получаю надоедливое окно консоли. Я предполагаю, что это вызвано вызовом os.system. Есть ли способ выполнить другие файлы из my .pyw скрипт без поднятия окна консоли вообще?

6 ответов


вы можете попробовать использовать подпроцесс модуль (subprocess.Popen, subprocess.call или что угодно) с аргументом shell=True Если вы хотите избежать запуска окна консоли.


вы должны использовать subprocess.Popen класс, проходящий как startupinfo экземпляр значения параметра subprocess.STARTUPINFO класс удерживая subprocess.STARTF_USESHOWWINDOW флаг и


решение, которое описывает Петр, на самом деле не так сложно, как может показаться. Вот пример, где startupinfo перешло к check_call вызов для подавления окна консоли:

startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW

subprocess.check_call(cmd, startupinfo=startupinfo)

С удобных функций call, check_call и check_output вперед Их **kwargs до Popen конструктор, не требуется использовать Popen напрямую.


люди немного ленивые... Я бы спасибо @Piotr Dobrogost и @Frank S. Thomas на их ответы.

Я пришел с этим кодом, который работает в Linux и 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

позже...

args = [exe, ...]
out = subprocess.check_output(args, startupinfo=startupinfo)

Спасибо ребята ;)

дополнительно: обратите внимание, что следующий код с помощью "вызова" также работает на Python 2.7 (В Windows) с кодом "startupinfo" выше:

def run_command(cmd, sin, sout):
    print "Running cmd : %s"%(" ".join(cmd) )
    return subprocess.call( cmd, stdin=sin, stdout=sout, startupinfo=startupinfo)

Кажется, что " os.popen ' не создает окно консоли. Скрипт работает под 'pythonw'. Не уверен во всех случаях, но в моем случае это работает хорошо.

os.popen(command)

похоже на то, что @воочию сказал, я читал на форумах wxPython-user, что вы "заменяете" текущее запущенное приложение, которое было бы "command.com "или" CMD.exe", с pyw.exe или pythonw.ехе, когда вы используете что-то вроде следующего:

os.execl(sys.executable, *([sys.executable]+sys.argv))

посмотреть следующий пост

хотя я не знаю, как вы бы трубу io в этом случае.

Я считаю, что одним из преимуществ этого подхода является то, что вы запускаете свой скрипт несколько раз ваша панель задач ОС не заполняется значками CMD. Другой способ, если у вас есть несколько CMD, свернутых на панели задач и начать их закрывать, невозможно сказать, какой CMD идет с каким pythonw скриптом.