Как запустить python скрипт от имени системы Windows?
Есть клиент-серверное приложение, которое должно передавать данные вне зависимости входа в учетную запись (такое реализованно в litemanager server ). Пользователь не вошел в учетную запись, но программа уже работает и дает соединение. Хотелось бы такое же реализовать.
Отслеживать
2,253 2 2 золотых знака 10 10 серебряных знаков 37 37 бронзовых знаков
задан 3 июл 2020 в 20:52
71 7 7 бронзовых знаков
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
В зависимости от того, что делает скрипт, вы можете:
- упаковать его в сервис, который затем должен быть установлен
- добавьте его в реестр Windows (HKCU \ Software \ Microsoft \ Windows \ CurrentVersion \ Run)
- добавьте к нему ярлык в папку автозагрузки меню «Пуск» — его расположение может меняться в зависимости от версии ОС, но у установщиков всегда есть инструкция по установке ярлыка в эту папку
- используйте планировщик задач Windows, и тогда вы можете установить задачу для нескольких видов событий, включая вход в систему и запуск.
Фактическое решение зависит от ваших потребностей и от того, что на самом деле делает скрипт.
Некоторые заметки о различиях:
- Решение № 1 запускает скрипт с компьютера, а решение № 2 и № 3 запускают его, когда пользователь, установивший его, входит в систему.
- Также стоит отметить, что # 1 всегда запускает скрипт, в то время как # 2 и # 3 запускают скрипт только для определенного пользователя (я думаю, что если вы используете пользователя по умолчанию, то он будет запускаться для всех, но я не уверен в деталях).
- Решение № 2 немного более «скрыто» для пользователя, в то время как решение № 3 оставляет пользователю гораздо больше контроля в плане отключения автоматического запуска.
- Наконец, решение № 1 требует административных прав, в то время как два других могут быть выполнены любым пользователем.
- Решение № 4 — это то, что я обнаружил в последнее время, и оно очень простое. Единственная проблема, которую я заметил, состоит в том, что скрипт python вызовет появление небольшого командного окна.
Как видите, все сводится к тому, что вы хотите сделать; например, если это что-то только для ваших целей, я бы просто перетащил его в папку автозагрузки.
В любом случае, в последнее время я полагаюсь на решение № 4, как на самый быстрый и простой подход.
Как запустить скрипт на Python
Начинающий разработчик на Python, помимо синтаксиса и основных правил использования операторов этого языка, должен уметь запускать код на исполнение. Ведь только так можно понять, работает ли написанный вами скрипт, или в нем содержатся ошибки. Рассмотрим подробнее, как можно запустить скрипты в терминале операционной системы, в интегрированной среде разработки или просто из интерфейса ОС. Это позволит вам выбрать подходящий вариант и повысить эффективность своей работы.
Интерпретатор Python
Рассматриваемый язык программирования является одним из самых прогрессивных на текущий момент. Он позволяет быстро и эффективно решать задачи в самых разных областях. Однако под термином Python понимают также интерпретатор, то есть программу на компьютере, которая позволяет запускать на исполнение написанные скрипты. Она представляет собой дополнительный программный слой между аппаратным обеспечением ПК и кодом.
Существует несколько интерпретаторов:
- написанные на языке программирования С;
- написанные на языке программирования Java;
- написанные на языке Python;
- программы, реализованные в среде .NET.
Выбор конкретного варианта для конечного пользователя значения не имеет. Независимо от вида программы, написанный код будет выполняться именно так, как предусмотрено правилами этого языка.
Запуск возможен двумя способами: как готовая к использованию программная последовательность (скрипт или модуль) или как отдельные куски кода, которые вводятся прямо в окно программы.
Интерактивный запуск кода
Для тестирования отдельных команд можно использовать интерпретатор в режиме интерактивного сеанса. Для этого необходимо открыть командную строку операционной системы и ввести команду, которая запускает интерпретатор.
Для ОС Linux это будет выглядеть следующим образом:
$ python3 Python 3.6.7 (default, Oct 22 2018, 11:32:17) [GCC 8.2.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>>
Теперь можно вводить команды, которые будут выполняться сразу после этого. Минус подобного подхода в том, что вся введенная последовательность не сохраняется после закрытия текущей сессии.
Интерактивное исполнение кода необходимо для того, чтобы немедленно протестировать фрагмент написанного кода. Кроме того, его можно использовать в процессе обучения для проверки действий тех или иных операторов «на лету». Этот способ интерпретации команд позволяет попробовать нужные вам функции языка, не прибегая к написанию отдельных скриптов для этого.
Выйти из интерактивного режима можно с помощью команды quit(), или просто закрыв окно терминала в Windows.
Для открытия терминала или командной строки перед запуском самого интерпретатора необходимо:
- В Windows нажать комбинацию клавиш «Флажок» + «R», после чего ввести команду cmd и нажать на кнопку «ОК» в диалоговом окне.
- В Linux или других подобных операционных системах доступ к командной строке предоставляется с помощью дополнительной программы. Можно использовать xterm или Konsole.
- В macOS для получения доступа к терминалу необходимо выбрать меню «Приложения», после чего перейти в раздел «Утилиты» и кликнуть на элементе «Терминал».
Как работает интерпретатор Python для скриптов
Запуск на исполнение написанных скриптов или модулей производится в пакетном режиме. И выполняется по сложной схеме, которая состоит из следующих этапов:
- Последовательная обработка всех операторов, которые записаны в скрипте.
- Компиляция исходного хода в промежуточный формат. Интерпретатор создает байт-код, который представляет собой язык программирования низкого уровня, независимый от платформы и операционной системы. Байт-код необходим для оптимизации процесса выполнения скрипта.
- Исполнение полученного кода. На этом этапе вступает в действие виртуальная машина Python (PVM), которая циклично перебирает каждый оператор из скрипта и запускает его на исполнение. Как будто вы вводите каждую команду последовательно в интерактивном интерпретаторе.
Запуск скриптов в командной строке
В интерактивном режиме, который обсуждался выше, можно записывать и выполнять любое количество строк кода. Но после закрытия окна терминала они не сохраняются. Поэтому реальные программы на Python пишутся в виде скриптов и представляют собой обычные текстовые файлы. Чтобы избежать путаницы при их хранении, им присваиваются расширения .py или .piw.
Создавать текстовый файл можно с помощью любого редактора, в том числе Notepad. Однако лучше использовать более продвинутые решения, например Sublime Text. Для примера возьмем наиболее простой скрипт, с которого начинается знакомство с любым языком программирования.
#!/usr/bin/env python3 print('Hello World!')
Файл можно сохранить в вашем рабочем каталоге с любым именем и расширением .py.
Чтобы запустить скрипт на исполнение, нужно использовать интерпретатор языка программирования и в качестве дополнительного параметра указать имя созданного вами файла.
$ python3 hello.py Hello World!
В приведенном выше примере файл был назван «hello.py». После ввода команды нужно нажать клавишу «Ввод», и на экране появится результат работы скрипта. То есть надпись «Привет, Мир» или классическое английское «Hello World»!
Если файл с программой сохранен не в каталоге с интерпретатором, нужно указывать путь к нему.
Переназначение устройства вывода информации
При исполнении программного кода на Python иногда необходимо сохранять результаты, которые отображает на экране программа. Они в дальнейшем анализируются для поиска ошибок или других целей. В этом случае скрипт необходимо запускать следующей командой:
$ python3 hello.py > output.txt
По результатам работы скрипта создается файл с именем output.txt, в который сохраняется все то, что должно было появиться на экране во время работы в программе. Это стандартный синтаксис, предусмотренный операционной системой.
Если файла с заданным именем не существует, ОС создает его автоматически. Если существует – данные в нем перезаписываются без сохранения предыдущих. В случае, когда есть необходимость в добавлении данных в конец текстового файла, вместо одного значка > необходимо указать два >>.
Прокачать навык программирования на Python и найти работу Junior Python разработчика помогут наши менторы Выбрать ментора
Запуск из командной строки без интерпретатора
В последних версиях операционной системы Windows добавлена возможность запускать скрипты на Python без ввода в командной строке названия программы-интерпретатора. То есть необходимо просто написать название файла с расширением.
C:\devspace> hello.py Hello World!
Обусловлено это тем, что при клике на файле или запуске его из командной строки операционная система автоматически ищет связанное приложение и запускает его. Точно так же вы открываете файлы Word, просто кликнув на них курсором мыши.
В Unix таким образом тоже можно запускать скрипты. Однако для этого в первую строку текстового файла с командами необходимо добавить текст #!/Usr/bin/env python. Он указывает на программу, с помощью которой производится запуск. А интерпретатор языка программирования расценивает строку как комментарий и пропускает её.
Запуск скриптов из интерактивного режима
Находясь в интерактивном режиме (описан в первом разделе), пользователь может загрузить файл с написанной ранее последовательностью команд и запустить его на исполнение. Такой способ можно применять, когда модуль содержит вызовы функций, методов или других операторов, генерирующих текст на экране. В противном случае видимых результатов работы программы не будет.
Запустить скрипт из интерактивного режима можно командой:
>>> import hello Hello World!
Обратите внимание, что эта команда срабатывает один раз за интерактивный сеанс. Поэтому, если внести изменения в файл со скриптом и перезапустить его этой командой, ничего не произойдет.
Заключение
Теперь вы знаете, что команды и скрипты Python можно запускать разными способами и в разных режимах. Это позволит вам выбрать нужный вариант для решения конкретной задачи, увеличить скорость своей работы, сделать ее продуктивной и гибкой.
© Copyright 2014 — 2023 mkdev | Privacy Policy
Запуск Python скрипта от имени системы (Windows)
Написал скрипт для удаления неких разделов, подразделов и их ключей, в т.ч. в кусте реестра HKEY_LOCAL_MACHINE.
Использую модуль winreg, для доступа указаны привилегии winreg.KEY_ALL_ACCESS.
Есть проблемка, даже при запуске скрипта от имени Администратора возникает ошибка: «[WinError 5] Отказано в доступе», именно для HKEY_LOCAL_MACHINE.
Погуглив и поискав инфу самостоятельно, понял, что в HKEY_LOCAL_MACHINE так просто нельзя удалять/менять/просматривать что-либо даже администратору системы.
Есть ли вариант как запустить скрипт от имени системы?
Пробовал через планировщик задач, но не завелось, задача завершается с кодом возврата 2147942401, перенаправление вывода скрипта в C:\out.txt не срабатывает:
Exited3n
Codeby Games
10.05.2022 541 154
Всем доброго времени суток, уважаемые форумчане!
Написал скрипт для удаления неких разделов, подразделов и их ключей, в т.ч. в кусте реестра HKEY_LOCAL_MACHINE.
Использую модуль winreg, для доступа указаны привилегии winreg.KEY_ALL_ACCESS.
Есть проблемка, даже при запуске скрипта от имени Администратора возникает ошибка: «[WinError 5] Отказано в доступе», именно для HKEY_LOCAL_MACHINE.
Погуглив и поискав инфу самостоятельно, понял, что в HKEY_LOCAL_MACHINE так просто нельзя удалять/менять/просматривать что-либо даже администратору системы.
Есть ли вариант как запустить скрипт от имени системы?
Пробовал через планировщик задач, но не завелось, задача завершается с кодом возврата 2147942401, перенаправление вывода скрипта в C:\out.txt не срабатывает:
Все у тебя правильно, права наивысшие, система стоит. Попробуй в планировщике указать батник, а в него пропищи python script.py blah blah
Сейчас попробовал из под админа удалить запись из HKLM, все ок. Юзал powershell.
Способы запуска скриптов Python
При запуске, интерпретатор CPython сканирует командную строку и переменную среду с целью настройки параметров выполнения скрипта.
Схемы командной строки и ее параметров других реализаций могут отличаться. Смотрите альтернативные реализации языка Python для уточнения параметров запуска конкретной реализации.
При вызове Python можно указать любой из следующих параметров:
$ python [-bBdEhiIOqsSuvVWx?] [-c command | -m module-name | script | - ] [args]
Напишем и сохраним в файл test.py небольшую программку, которую будем запускать разными способами.
#!/usr/bin/env python3 def hello(text): print(f'Функция "text>"') print('Привет Мир') if __name__ == '__main__': hello('hello')
Самым распространенным вариантом использования, конечно, является простой вызов скрипта:
$ python3 test.py # Привет Мир # Функция "hello"
Содержание:
- Перенаправление вывода программы;
- Запуск скрипта как модуля с параметром -m ;
- Запуск скрипта в интерактивном режиме с параметром -i ;
- Использование имени файла скрипта;
- Запуск скрипта при выполнении импорта;
- Использование модуля importlib ;
- Использование модуля runpy ;
- Использование функции exec() .
Перенаправление вывода программы.
Иногда бывает полезно сохранить вывод скрипта для последующего анализа. Вот как это сделать:
$ python3 test.py > output.txt
Эта операция сохраняет вывод скрипта в файл output.txt , а не в стандартный системный вывод stdout . В результате на экран попадёт только поток ошибок stderr (в случае их появления). Этот процесс широко известен как перенаправление потока и доступен как в Windows, так и в Unix-подобных системах. Если output.txt не существует, он создается автоматически, если файл уже существует, то его содержимое будет заменено новым выводом.
Что-бы накапливать/добавлять вывод последовательных исполнений скрипта в конец файла output.txt , то нужно использовать две угловые скобки >> вместо одной:
$ python3 test.py >> output.txt
Ну и наконец перенаправление в файл только вывода ошибок (в случае их появления). Для этого достаточно перенаправить стандартный поток ошибок, используя команду 2> (2 — это дескриптор стандартного потока ошибок). В результате на экран попадёт только то, что команда отправляет в стандартный вывод:
$ python3 test.py 2> error.txt
Если необходимо перенаправить в файл вывод всего того, что появляется в консоли при выполнения скрипта ( stdout и stderr ), и при этом накапливать вывод в файле, то запуск сценария должен выглядеть следующим образом:
$ python3 test.py >> output.log 2>&1 # или проще $ python3 test.py &>> output.log
Как быть, если нужно сохранить результаты работы сценария Python в отдельный файл, не смешивая данные со сведениями об ошибках? Так как потоки можно перенаправлять независимо друг от друга, то можно добавить в команду запуска сценария перенаправления стандартного потока вывода в один файл, а ошибок в другой файл:
$ python3 test.py > output.txt 2> error.txt # с добавлением результатов сценария # в `output.txt` и перезаписью `error.txt` $ python3 test.py >> output.txt 2> error.txt
Запуск скрипта как модуля с параметром -m .
Python предлагает ряд параметров командной строки, которые можно использовать в соответствии со своими потребностями. Например, если нужно запустить модуль Python, то необходимо использовать команду python -m .
Опция -m ищет в sys.path имя модуля и запускает его содержимое как __main__ :
$ python3 -m test # Привет Мир # Функция "hello"
Примечание: имя модуля должно быть именем объекта модуля, а не просто строкой.
Запуск скрипта в интерактивном режиме с параметром -i .
Иногда необходимо в ручную протестировать некоторые функции или классы скрипта, и здесь программиста выручает интерактивный режим работы интерпретатора Python. После того как скрипт отработает, интерпретатор Python перейдет в режим командной строки. В этом режиме, например, можно вызвать любую функцию, определенную в скрипте с другими аргументами.
$ python3 -i test.py # Привет Мир # Функция "hello" # здесь можно запустить любую # функцию с другими аргументами >>> hello('печатает слово Привет!') # Функция "печатает слово Привет!"
Использование имени файла скрипта
В последних версиях Windows можно запускать сценарии Python, просто введя имя файла, содержащего код, в командной строке:
C:\> test.py # Привет Мир # Функция "hello"
Это возможно, потому что Windows использует системный реестр и ассоциацию файлов, чтобы определить, какую программу использовать для запуска определенного файла.
В Unix-подобных системах, таких как GNU/Linux, можно добиться такого поведения добавив первую строку с текстом #!/usr/bin/env python3 . Для Python это простой комментарий, а для операционной системы эта строка указывает, какую программу необходимо использовать для запуска файла.
Эта строка начинается с комбинация символов #! , которая обычно называется «хеш-банг» или «шебанг«, и указывает путь к интерпретатору.
Есть два способа указать путь к интерпретатору:
- абсолютный путь к интерпретатору: #!/usr/bin/python3 .
- использование команды env операционной системы, которая находит и запускает Python путем поиска в переменной окружения PATH : #!/usr/bin/env python3 .
И наконец, чтобы выполнить скрипт в Linux, необходимо назначить ему права на выполнение.
Вот пример того, как это сделать:
# Даем права на выполнение $ chmod +x test.py # Запускаем скрипт, используя его имя файла $ ./test.py # Привет Мир # Функция "hello"
Обратите внимание, что если скрипт не находится в текущем рабочем каталоге, то необходимо указать путь к файлу скрипта, чтобы он запустился.
Запуска скриптов из интерактивного сеанса.
Также можно запускать сценарии и модули Python из интерактивного сеанса. Этот вариант предлагает множество возможностей.
Запуск скрипта при выполнении импорта.
В момент импорта модуля происходит загрузка его содержимого для последующего доступа и использования. Самое интересное в этом процессе то, что на последнем этапе import запускает код.
Когда модуль содержит только определения классов, функций, переменных и констант, то не будет видно, что код действительно выполнялся, но когда модуль включает в себя вызовы функций, методов или других инструкций, которые генерируют видимые результаты и расположенные вне сценария верхнего уровня ‘__main__’ , тогда станете свидетелем его исполнения.
>>> import test # Привет Мир # вызов функции `hello()` >>> test.hello('запускается как test.hello()') # Функция "запускается как test.hello()" # выполним импорт только функции `hello()` >>> from test import hello >>> hello('запускается как hello()') # Функция "запускается как hello()"
Необходимо отметить, что код, который выполняется вне сценария верхнего уровня ‘__main__’ — работает только один раз за сеанс. После первого импорта последующие импорты ничего не делают, даже если изменить содержимое модуля. Это связано с тем, что операции импорта являются дорогостоящими и поэтому выполняются только один раз.
Использование модуля importlib .
Стандартная библиотеке Python содержит модуль importlib , который предоставляет функцию importlib.reload() . С помощью этой функции можно заставить интерпретатор повторно импортировать модуль и, следовательно, выполнить код модуля заново.
Обратите внимание, что аргумент importlib.reload() должен быть именем объекта модуля, а не строкой!
# пробуем импортировать еще раз import test # ничего не происходит >>> import importlib >>> importlib.reload(test) # Привет Мир #
Функция importlib.reload() также будет полезна, если вы отредактировали исходный файл модуля с помощью внешнего редактора и хотите опробовать новую версию, не выходя из интерпретатора Python.
Использование модуля runpy .
Стандартная библиотека включает модуль runpy , которая имеет функцию runpy.run_module() , позволяющая запускать модули без их предварительного импорта. Эта функция возвращает словарь глобальных переменных исполняемого модуля.
>>> import runpy >>> runpy.run_module(mod_name='test') # Привет Мир # # . вывод сокращен . # 'hello': >
Запускаемый модуль ищется с использованием стандартного механизма импорта, а затем выполняется в новом пространстве имен модулей. Первым аргументом runpy.run_module() должна быть строка с абсолютным именем выполняемого модуля без расширения .py .
Модуль runpy также предоставляет функцию runpy.run_path() , которая позволит запустить модуль, указав его расположение в файловой системе:
>>> import runpy >>> runpy.run_path(path_name='test.py') # Привет Мир # # . вывод сокращен . # 'hello': >
Как и runpy.run_module() , так и runpy.run_path() возвращает глобальный словарь исполняемого модуля.
Аргумент path_name должен быть строкой и может ссылаться на следующее:
- Расположение исходного файла Python
- Расположение скомпилированного файла байт-кода
- Значение допустимой записи в sys.path , содержащей модуль __main__ (файл __main__.py )
Использование функции exec() .
Встроенная функция exec() поддерживает динамическое выполнение кода Python, тем самым предоставляет альтернативный способ запуска скриптов:
exec(open('test.py').read()) # Привет Мир # Функция "hello"
Здесь функция open() открывает файл test.py , считывает его содержимое и отправляет в функцию exec() , которая, в свою очередь, запускает код.
Приведенный выше пример немного не соответствует действительности. Это просто «ХАК«, который показывает, насколько может быть Python универсальным и гибким.
- КРАТКИЙ ОБЗОР МАТЕРИАЛА.
- Режимы интерфейса интерпретатора Python
- Общие параметры/флаги командной строки Python
- Переменные среды окружения Python
- Поддержка Python Linux perf profiler