Python как запустить программу без консоли
В скриптах, написанных для автоматизации определенных задач, нам часто требуется запускать внешние программы и контролировать их выполнение. При работе с Python мы можем использовать модуль subprocess для создания подобных скриптов. Этот модуль является частью стандартной библиотеки языка. В данном руководстве мы кратко рассмотрим subprocess и изучим основы его использования.
Прочитав статью, вы узнаете как:
- Использовать функцию run для запуска внешнего процесса.
- Получить стандартный вывод процесса и информацию об ошибках.
- Проверить код возврата процесса и вызвать исключение в случае сбоя.
- Запустить процесс, используя оболочку в качестве посредника.
- Установить время ожидания завершения процесса.
- Использовать класс Popen напрямую для создания конвейера ( pipe ) между двумя процессами.
Так как модуль subprocess почти всегда используют с Linux все примеры будут касаться Ubuntu. Для пользователей Windows советую скачать терминал Ubuntu 18.04 LTS.
Функция «run»
Функция run была добавлена в модуль subprocess только в относительно последних версиях Python (3.5). Теперь ее использование является рекомендуемым способом создания процессов и должно решать наиболее распространенные задачи. Прежде всего, давайте посмотрим на простейший случай применения функции run .
Предположим, мы хотим запустить команду ls -al ; для этого в оболочке Python нам нужно ввести следующие инструкции:
Вывод внешней команды ls отображается на экране:
Здесь мы просто использовали первый обязательный аргумент функции run , который может быть последовательностью, «описывающей» команду и ее аргументы (как в примере), или строкой, которая должна использоваться при запуске с аргументом shell=True (мы рассмотрим последний случай позже).
Захват вывода команды: stdout и stderr
Что, если мы не хотим, чтобы вывод процесса отображался на экране. Вместо этого, нужно чтобы он сохранялся: на него можно было ссылаться после выхода из процесса? В этом случае нам стоит установить для аргумента функции capture_output значение True :
Как мы можем впоследствии получить вывод ( stdout и stderr ) процесса? Если вы посмотрите на приведенные выше примеры, то увидите, что мы использовали переменную process для ссылки на объект CompletedProcess , возвращаемый функцией run . Этот объект представляет процесс, запущенный функцией, и имеет много полезных свойств. Помимо прочих, stdout и stderr используются для «хранения» соответствующих дескрипторов команды, если, как уже было сказано, для аргумента capture_output установлено значение True . В этом случае, чтобы получить stdout , мы должны использовать:
По умолчанию stdout и stderr представляют собой последовательности байтов. Если мы хотим, чтобы они хранились в виде строк, мы должны установить для аргумента text функции run значение True .
Управление сбоями процесса
Команда, которую мы запускали в предыдущих примерах, была выполнена без ошибок. Однако при написании программы следует принимать во внимание все случаи. Так, что случится, если порожденный процесс даст сбой? По умолчанию ничего «особенного» не происходит. Давайте посмотрим на примере: мы снова запускаем команду ls , пытаясь вывести список содержимого каталога /root, который не доступен для чтения обычным пользователям:
Мы можем узнать, не завершился ли запущенный процесс ошибкой, проверив его код возврата, который хранится в свойстве returncode объекта CompletedProcess :
Видите? В этом случае returncode равен 2 , подтверждая, что процесс столкнулся с ошибкой, связанной с недостаточными правами доступа, и не был успешно завершен. Мы могли бы проверять выходные данные процесса таким образом чтобы при возникновении сбоя возникало исключение. Используйте аргумент check функции run : если для него установлено значение True , то в случае, когда внешний процесс завершается ошибкой, возникает исключение CalledProcessError :
Обработка исключений в Python довольно проста. Поэтому для управления сбоями процесса мы могли бы написать что-то вроде:
Исключение CalledProcessError , как мы уже сказали, возникает, когда код возврата процесса не является 0 . У данного объекта есть такие свойства, как returncode , cmd , stdout , stderr ; то, что они представляют, довольно очевидно. Например, в приведенном выше примере мы просто использовали свойство cmd , чтобы отобразить последовательность, которая использовалась для запуска команды при возникновении исключения.
Выполнение процесса в оболочке
Процессы, запущенные с помощью функции run , выполняются «напрямую», это означает, что для их запуска не используется оболочка: поэтому для процесса не доступны никакие переменные среды и не выполняются раскрытие и подстановка выражений. Давайте посмотрим на пример, который включает использование переменной $HOME :
Как видите, переменная $HOME не была заменена на соответствующее значение. Такой способ выполнения процессов является рекомендованным, так как позволяет избежать потенциальные угрозы безопасности. Однако, в некоторых случаях, когда нам нужно вызвать оболочку в качестве промежуточного процесса, достаточно установить для параметра shell функции run значение True . В таких случаях желательно указать команду и ее аргументы в виде строки:
Все переменные, существующие в пользовательской среде, могут использоваться при вызове оболочки в качестве промежуточного процесса. Хотя это может показаться удобным, такой подход является источником проблем. Особенно при работе с потенциально опасным вводом, который может привести к внедрению вредоносного shell-кода. Поэтому запуск процесса с shell=True не рекомендуется и должен использоваться только в безопасных случаях.
Ограничение времени работы процесса
Обычно мы не хотим, чтобы некорректно работающие процессы бесконечно исполнялись в нашей системе после их запуска. Если мы используем параметр timeout функции run , то можем указать количество времени в секундах, в течение которого процесс должен завершиться. Если он не будет завершен за это время, процесс будет остановлен сигналом SIGKILL. Который, как мы знаем, не может быть перехвачен. Давайте продемонстрируем это, запустив длительный процесс и предоставив timeout в секундах:
В приведенном выше примере мы запустили команду ping без указания фиксированного числа пакетов ECHO REQUEST, поэтому она потенциально может работать вечно. Мы также установили время ожидания в 5 секунд с помощью параметра timeout . Как мы видим, ping была запущена, а по истечении 5 секунд возникло исключение TimeoutExpired и процесс был остановлен.
Функции call, check_output и check_call
Как мы уже говорили ранее, функция run является рекомендуемым способом запуска внешнего процесса. Она должна использоваться в большинстве случаев. До того, как она была представлена в Python 3.5, тремя основными функциями API высокого уровня, применяемыми для создания процессов, были call , check_output и check_call ; давайте взглянем на них вкратце.
Прежде всего, функция call : она используется для выполнения команды, описанной параметром args; она ожидает завершения команды; ее результатом является соответствующий код возврата. Это примерно соответствует базовому использованию функции run.
Поведение функции check_call практически не отличается от run , когда для параметра check задано значение True : она запускает указанную команду и ожидает ее завершения. Если код возврата не равен 0 , возникает исключение CalledProcessError .
Наконец, функция check_output . Она работает аналогично check_call , но возвращает вывод запущенной программы, то есть он не отображается при выполнении функции.
Работа на более низком уровне с классом Popen
До сих пор мы изучали функции API высокого уровня в модуле subprocess, особенно run . Все они под капотом используют класс Popen . Из-за этого в подавляющем большинстве случаев нам не нужно взаимодействовать с ним напрямую. Однако, когда требуется большая гибкость, без создания объектов Popen не обойтись.
Предположим, например, что мы хотим соединить два процесса, воссоздав поведение конвейера (pipe) оболочки. Как мы знаем, когда передаем две команды в оболочку, стандартный вывод той, что находится слева от пайпа «|», используется как стандартный ввод той, которая находится справа. В приведенном ниже примере результат выполнения двух связанных конвейером команд сохраняется в переменной:
Чтобы воссоздать подобное поведение с помощью модуля subprocess без установки параметра shell в значение True , как мы видели ранее, мы должны напрямую использовать класс Popen :
I wish to make stand-alone binaries for Linux and Windows of it. And mainly I wish that when the bot initiates, the console window should hide and the user should not be able to see the window.
What can I do for that?
9 Answers 9
Simply save it with a .pyw extension. This will prevent the console window from opening.
On Windows systems, there is no notion of an “executable mode”. The Python installer automatically associates .py files with python.exe so that a double-click on a Python file will run it as a script. The extension can also be .pyw, in that case, the console window that normally appears is suppressed.
In linux, just run it, no problem. In Windows, you want to use the pythonw executable.
Update
Okay, if I understand the question in the comments, you're asking how to make the command window in which you've started the bot from the command line go away afterwards?
I think that's right. In any case, now you can close the terminal.
Thats not the main issue . The main issue is to hide the console window then the program is running. How do it do that ?
"nohup mypythonprog &" will help me in linux . but python is not gonna be installed on the windows machine. So "start pythonw mypythonprog" wont help me i guess.
On Unix Systems (including GNU/Linux, macOS, and BSD)
Use nohup mypythonprog & , and you can close the terminal window without disrupting the process. You can also run exit if you are running in the cloud and don't want to leave a hanging shell process.
On Windows Systems
Save the program with a .pyw extension and now it will open with pythonw.exe . No shell window.
For example, if you have foo.py , you need to rename it to foo.pyw .
This will hide your console. Implement these lines in your code first to start hiding your console at first.
Update May 2020 :
If you've got trouble on pip install win32con on Command Prompt, you can simply pip install pywin32 .Then on your python script, execute import win32.lib.win32con as win32con instead of import win32con .
To show back your program again win32con.SW_SHOW works fine:
Please explain your code in English. Thanks! Someone who doesn't need an explanation could have written it themselves.
to show the hided program again use this line: win32gui.ShowWindow(The_program_to_hide , win32con.SW_SHOW)
If all you want to do is run your Python Script on a windows computer that has the Python Interpreter installed, converting the extension of your saved script from '.py' to '.pyw' should do the trick.
But if you're using py2exe to convert your script into a standalone application that would run on any windows machine, you will need to make the following changes to your 'setup.py' file.
С -c (команда) аргумент (при условии, что ваш файл называется foo.py ):
альтернативно, если вы не заботитесь о загрязнении пространства имен:
просто поставить hello() где-то ниже функции и он будет выполняться, когда вы делаете python your_file.py
для более аккуратного решения вы можете использовать это:
таким образом, функция будет выполняться только при запуске файла, а не при импорте файла.
python -c 'from myfile import hello; hello()' здесь myfile необходимо заменить базовым именем вашего скрипта Python. (Напр., myfile.py становится myfile ).
однако, если hello() ваша "постоянная" основная точка входа в ваш скрипт Python, тогда обычный способ сделать это выглядит следующим образом:
это позволяет выполнить скрипт, просто запустив python myfile.py или python -m myfile .
некоторые объяснения здесь: __name__ - специальная переменная Python, которая содержит имя модуля в настоящее время выполняется,за исключением когда модуль запускается из командной строки, в этом случае он становится "__main__" .
Я написал быстрый маленький скрипт Python, который вызывается из командной строки bash. Он принимает имя модуля, класса и метода, который вы хотите вызвать, и параметры, которые вы хотите передать. Я называю его Пирун и перестал .py расширение и сделал его исполняемым с chmod +x PyRun, так что я могу просто назвать его быстро, как следовать:
сохраните это в файле под названием PyRun
вот пример модуля, чтобы показать, как это работает. Это сохраняется в файле под названием PyTest.py:
попробуйте запустить следующие примеры:
обратите внимание на последний пример экранирования скобок для передачи кортежа в качестве единственного параметра второму методу.
если вы передадите слишком мало параметров для того, что нужно методу, вы получите ошибку. Если вы проходите слишком много, он игнорирует дополнительные. Модуль должен быть в текущей рабочей папке, поставить PyRun можно в любом месте на вашем пути.
интересно, что если целью была печать на консоль командной строки или выполнение какой-либо другой минутной операции python, вы можете передать ввод в интерпретатор python следующим образом:
а также трубные файлы..
*обратите внимание, что расширение не должно быть.py для второго, чтобы работать. ** Также обратите внимание, что для bash вам может потребоваться избежать символов
Если вы устанавливаете пакет runp с pip install runp не работает:
runp myfile.py hello
давайте сделаем это немного проще для себя и просто использовать модуль.
попробуй: pip install compago
тогда используйте так:
Примечание:ошибка в Python 3 на данный момент, но отлично работает с Python 2.
Edit: еще лучший вариант, на мой взгляд-это модуль пожар от Google, что позволяет легко также передавать аргументы функции. Это установлен с pip install fire . Из их GitHub:
вот простой пример.
затем из командной строки, вы можете запустить:
У меня было требование использовать различные утилиты python(range, string и т. д.) в командной строке и написал инструмент pyfunc специально для этого. Вы можете использовать его, чтобы обогатить опыт использования командной строки:
эта функция не может быть запущена из командной строки, так как она возвращает значение, которое не будет обработано. Вы можете удалить возврат и использовать print вместо
это всегда возможность ввести python в командной строке с помощью команды python
затем импортируйте файл так импорт example_file
затем выполнить команду example_file.hello ()
Это позволяет избежать странного .функция копирования pyc, которая появляется каждый раз при запуске python-c и т. д.
возможно, не так удобно, как одна команда, но хорошее быстрое исправление текста файла из командной строки и позволяет использовать python для вызова и выполнения файла.
что-то вроде этого: call_from_terminal.py
это работает в bash.
ниже Odd_Even_function.py файл с определением функции.
теперь, чтобы вызвать то же самое из командной строки ниже, параметры работали для меня.
опции 1 Полный путь к exe\python.exe-c "импорт Odd_Even_function; Odd_Even_function.OE (100)"
2 Полный путь к exe\python.exe-c "из Odd_Even_function импортировать OE; OE(100)"
Код, написанный на языке Python, может храниться в редакторе кода, IDE или файле. И он не будет работать, если не знать, как его правильно запускать.
В этом материале рассмотрим 7 способов запуска кода, написанного на Python. Они будут работать вне зависимости от операционной системы, среды Python или местоположения кода.
Где запускать Python-скрипты и как?
Python-код можно запустить одним из следующих способов:
- С помощью командной строки операционной системы (shell или терминал);
- С помощью конкретной версии Python или Anaconda;
- Использовать Crontab;
- Запустить код с помощью другого Python-скрипта;
- С помощью файлового менеджера;
- Использовать интерактивный режим Python;
- Использовать IDE или редактор кода.
Запуск Python-кода интерактивно
Для запуска интерактивной сессии нужно просто открыть терминал или командную строку и ввести python (или python3 в зависимости от версии). После нажатия Enter запустится интерактивный режим.
Вот как запустить интерактивный режим в разных ОС.
Интерактивный режим в Linux
Откройте терминал. Он должен выглядеть приблизительно вот так :
После нажатия Enter будет запущен интерактивный режим Python.
Интерактивный режим в macOS
На устройствах с macOS все работает похожим образом. Изображение ниже демонстрирует интерактивный режим в этой ОС.
Интерактивный режим в Windows
В Windows нужно открыть командную строку и ввести python . После нажатия Enter появится приблизительно следующее:
Запуск Python-скриптов в интерактивном режиме
В таком режиме можно писать код и исполнять его, чтобы получить желаемый результат или отчет об ошибке. Возьмем в качестве примера следующий цикл.
Этот код должен выводить целые числа от 0 до 5. В данном случае вывод — все, что появилось после print(i) .
Для выхода из интерактивного режима нужно написать следующее:
И нажать Enter. Вы вернетесь в терминал, из которого и начинали.
Есть и другие способы остановки работы с интерактивным режимом Python. В Linux нужно нажать Ctrl + D, а в Windows — Ctrl + Z + Enter.
Стоит отметить, что при использовании этого режима Python-скрипты не сохраняются в локальный файл.
Как выполняются Python-скрипты?
Отличный способ представить, что происходит при выполнении Python-скрипта, — использовать диаграмму ниже. Этот блок представляет собой скрипт (или функцию) Python, а каждый внутренний блок — строка кода.
При запуске скрипта интерпретатор Python проходит сверху вниз, выполняя каждую из них. Именно таким образом происходит выполнение кода.
Но и это еще не все.
Блок-схема выполнения кода интерпретатором
- Шаг 1: скрипт или .py-файл компилируется, и из него генерируются бинарные данные. Готовый файл имеет расширение .pyc или .pyo.
- Шаг 2: генерируется бинарный файл. Он читается интерпретатором для выполнения инструкций.
Это набор инструкций, которые приводят к финальному результату.
Иногда полезно изучать байткод. Если вы планируете стать опытным Python-программистом, то важно уметь понимать его для написания качественного кода.
Это также пригодится для принятия решений в процессе. Можно обратить внимание на отдельные факторы и понять, почему определенные функции/структуры данных работают быстрее остальных.
Как запускать Python-скрипты?
Для запуска Python-скрипта с помощью командной строки сначала нужно сохранить код в локальный файл.
Возьмем в качестве примера файл, который был сохранен как python_script.py. Сохранить его можно вот так:
- Создать Python-скрипт из командной строки и сохранить его,
- Создать Python-скрипт с помощью текстового редактора или IDE и сохранить его. Просто создайте файл, добавьте код и сохраните как «python_script.py»
Сохранить скрипт в текстовом редакторе достаточно легко. Процесс ничем не отличается от сохранения простого текстового файла.
Но если использовать командную строку, то здесь нужны дополнительные шаги. Во-первых, в самом терминале нужно перейти в директорию, где должен быть сохранен файл. Оказавшись в нужной папке, следует выполнить следующую команду (на linux):
После нажатия Enter откроется интерфейс командной строки, который выглядит приблизительно следующим образом:
Теперь можно писать код и с легкостью сохранять его прямо в командной строке.
Как запускать скрипт в командной строке?
Скрипты можно запустить и с помощью команды Python прямо в интерфейсе терминала. Для этого нужно убедиться, что вы указали путь до него или находитесь в той же папке. Для выполнения скрипта (python_script.py) откройте командную строку и напишите python3 python_script.py .
Есть ли способ запустить скрипт Python в Windows XP без мгновенного появления командной оболочки? Мне часто нужно автоматизировать WordPerfect (для работы) с Python, и даже если мой скрипт не имеет вывода, если я запускаю его без WP, пустая оболочка все равно всплывает на секунду, прежде чем исчезнуть. Есть ли способ предотвратить это? Возможно, какое-то перенаправление вывода?
pythonw.exe запустит скрипт без командной строки. Проблема в том, что интерпретатор Python, Python.exe, связан с подсистемой консоли для создания вывода консоли (поскольку это 90% случаев) — вместо этого pythonw.exe связан с подсистемой графического интерфейса, и Windows не будет создавать консоль. выходное окно для него, если оно не запрашивает его.
В этой статье обсуждается программирование графического интерфейса с помощью Python, а также упоминается pythonw.exe. Также полезно отметить, что если ваши файлы Python заканчиваются .pyw на .py , стандартный установщик Windows правильно настроит ассоциации и запустит ваш Python в pythonw.exe.
В вашем случае это не похоже на проблему, но зависимость от pythonw.exe делает ваше приложение специфичным для Windows - существуют другие решения для этого, скажем, в Mac OS X.
Есть ли способ указать внутри скрипта Python погоду для использования python.exe или pythonw.exe ? Например, def prog_a(): run_as_pythonw() blah blah против def prog_b(): run_as_python() blah blah . Переключатель в беззвучный режим, если хотите.
Это не работает, как вы объяснили, чтобы использовать pythonw.exe для .pyw. Не могли бы вы обновить ответ. это 2016 год
Если вы назовете свои файлы с расширением «.pyw», Windows будет выполнять их с помощью интерпретатора pythonw.exe. Это не откроет консоль DOS для запуска вашего скрипта.
Я пробовал описанные выше методы, однако консоль по-прежнему появляется и быстро исчезает из-за таймера в моем сценарии. Наконец, я нашел следующий код:
Довольно просто в Win10:
откройте PowerShell и введите следующие команды:
Вставьте следующее в ваш файл openWindowed.vbs :
Файл .vbs выполнит ваш файл main.py без открытия cmd. Я часто использую это для файлов make.py , потому что не знаю скриптов cmake.
Я пробовал «ввести nul > openWindowed.vbs» и «nul > openWindowed.vbs». Оба выдавали ошибки. Кажется, вы просто создаете здесь пустые файлы, верно? Извините, я почти ничего не знаю о vbs или PowerShell.
Измените расширение файла на .pyw и добавьте следующую строку (измененную в соответствии с вашей версией Python) в начало вашего скрипта:
Теперь, если вы дважды щелкните файл, он будет выполнен pythonw.exe без окна консоли.
Это будет работать на всех версиях Windows:
1. Создайте файл « Runner.bat » с помощью Блокнота (или любого другого текстового редактора) и вставьте следующее содержимое:
где server.py — это путь к скрипту Python, который вы хотите запустить.
2. Создайте файл « RunScript.vbs » с помощью Блокнота и вставьте следующее содержимое:
3. Запустите файл « RunScript.vbs » двойным щелчком, и ваш скрипт Python будет запущен без видимых окон консоли.
ps Я знаю, что это не было частью вашего вопроса, но это часто бывает, если вы хотите запустить скрипт при запуске Windows (после входа пользователя), просто вставьте ярлык файла « RunScript.vbs » в папку автозагрузки. (В Windows 10 в основном в: C:\Users[ИМЯ ПОЛЬЗОВАТЕЛЯ]\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup )
Читайте также: