Выполнение скриптов на языке Python
Основные способы запуска файлов .py
Как запустить файл .py через терминал?
Основной способ выполнить файл сценария на Python состоит в передаче имени файла интерпретатору. Для этого используется командная строка операционной системы. Подходят PowerShell, CMD, Terminal в macOS и командная оболочка в Linux.
Пусть в файле example.py находится небольшой код:
print('Скрипт выполнен')
print(2 + 2)
Python run py file (запуск .py файла в python)
Запись в терминале выглядит как:
python example.py
В системах Linux и macOS часто используется команда python3:
python3 example.py
На Windows при установке из официального документа может быть доступна команда py:
py example.py
Если файл находится в другом каталоге, интерпретатору передается путь к нему:
python /home/user/scripts/example.py
python C:/Users/name/scripts/example.py
Интерпретатор Python выполняет инструкции последовательно. После завершения скрипта управление возвращается в оболочку. Такой запуск применяется для большинства автоматических задач, утилит и проверок кода.
Как запустить файл .py как модуль с помощью параметра -m?
Команда python -m example запускает файл example.py из текущего каталога как модуль. Расширение .py в команде не указывается.
python -m example
Для пакета используется точечная запись:
python -m package.module
Такой вариант удобен для проектов, в которых файл содержит относительные импорты. Запуск через -m корректно формирует __package__ и __name__, поэтому относительные импорты внутри пакета работают.
Как сделать .py файл исполняемым в Unix и macOS?
В Linux и macOS в первую строку файла добавляется shebang:
#!/usr/bin/env python3
Строка env находит интерпретатор python3 в переменной PATH. Пример файла:
#!/usr/bin/env python3
print('Прямой запуск')
Затем файлу назначается право на выполнение:
chmod +x script.py
После этого запуск выполняется без указания python:
./script.py
Цель такого варианта: получить самостоятельную команду для пользователя. Скрипт вызывается как обычная программа, а интерпретатор подставляется автоматически.
Как выполнить содержимое .py файла в интерактивной сессии Python?
В интерактивном режиме интерпретатора можно прочитать файл и передать его текст функции exec:
exec(open('script.py').read())
Для файла с кодировкой UTF-8 явно указывается encoding:
exec(open('script.py', encoding='utf-8').read())
Такой способ запуска подходит для быстрого тестирования внутри уже открытой сессии. Переменные из файла попадают в текущее пространство имен. Нужно учитывать, что выполнение непроверенного кода через exec небезопасно.
Как запустить скрипт из другого Python-файла в том же процессе?
Стандартный модуль runpy позволяет выполнить файл и получить его глобальные переменные:
import runpy
result = runpy.run_path('script.py')
print(result['value'])
Если в файле есть код:
value = 7 * 6
то программа выведет 42. Использование runpy подходит для случаев, когда нужно запустить скрипт без создания отдельного процесса и сохранить доступ к его данным.
Как запустить .py файл как отдельный процесс из Python?
Модуль subprocess создает новый процесс. Внутри другого Python-скрипта можно использовать sys.executable, чтобы применить тот же интерпретатор, который выполняет текущую программу:
import subprocess
import sys
process = subprocess.run([sys.executable, 'script.py'])
print(process.returncode)
Для получения вывода добавляются параметры capture_output и text:
process = subprocess.run(
[sys.executable, 'script.py'],
capture_output=True,
text=True
)
print(process.stdout)
Отдельный процесс нужен при изоляции сбоев, передаче данных через stdin/stdout и параллельном выполнении скриптов.
Как загрузить файл .py из произвольного пути через importlib?
Если нужно импортировать код, который не находится в sys.path, применяется importlib.util:
import importlib.util
spec = importlib.util.spec_from_file_location('custom_module', '/path/to/script.py')
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
print(module.some_variable)
Такой вариант полезен для подключения конфигураций или библиотек из внешнего каталога. Блок if __name__ == '__main__' не выполняется, если имя модуля не равно __main__.
Как выполнить скрипт и перейти в интерактивный режим?
Параметр -i оставляет интерпретатор открытым после выполнения файла:
python -i script.py
После окончания кода появляется приглашение, в котором можно обращаться к переменным из скрипта. Удобно для отладки и экспериментов с объектами.
Как указать папку для импортов при запуске скрипта?
Переменная окружения PYTHONPATH добавляет каталоги в список путей поиска модулей. В Linux или macOS:
PYTHONPATH=/home/user/mylibs python script.py
В командной строке Windows:
set PYTHONPATH=C:/path/to/libs
python script.py
В PowerShell:
$env:PYTHONPATH='C:/path/to/libs'; python script.py
Этот вариант нужен, когда скрипт импортирует модули из папки, которая не совпадает с текущим каталогом.
Какие ошибки чаще всего появляются при запуске .py файла?
python: command not found или python не является внутренней или внешней командой. Интерпретатор не установлен, либо его каталог не добавлен в PATH. В Windows во время установки выбирается пункт Add Python to PATH. В Linux команда может называться python3.
PermissionError: [Errno 13] Permission denied. При запуске через ./script.py файл не имеет права на выполнение. Команда chmod +x script.py решает эту проблему.
SyntaxError. Файл может быть написан для другой версии языка, например, код Python 2 запускается интерпретатором Python 3. Также некоторые конструкции требуют минимальную версию Python.
ModuleNotFoundError. В скрипте используется модуль, который не установлен в окружении. Установка зависимости выполняется через pip: python -m pip install requests.
UnicodeDecodeError. Файл прочитан в кодировке, отличной от ожидаемой. Рекомендуется сохранять исходный код в UTF-8 без BOM.
Ошибка shebang после переноса файла из Windows. Если первая строка содержит символ возврата каретки CRLF, оболочка может не найти интерпретатор. Файл нужно пересохранить с переводами строк LF.
Расширенные примеры запуска с параметрами и окружением
В этом разделе собраны сценарии, которые встречаются при работе с файлами .py в автоматизации, отладке и системном администрировании.
Как передать аргументы запускаемому скрипту?
import sys
if len(sys.argv) > 1:
print('Привет,', sys.argv[1])
else:
print('Привет, мир')
print('Аргументы:', len(sys.argv))
Команда запуска:
python greet.py Alex
Результат:
Привет, Alex Аргументы: 2
Список sys.argv содержит имя файла и все переданные значения. Первый элемент всегда путь к запускаемому файлу.
Как отключить буферизацию вывода?
import time
for i in range(3):
print('step', i)
time.sleep(1)
python -u log_script.py
step 0 step 1 step 2
Параметр -u включает безбуферный режим. При перенаправлении вывода в файл или конвейер строки появляются сразу, а не после заполнения буфера.
Как использовать скрипт после его выполнения?
x = 41
text = 'значение'
python -i vars_demo.py
После запуска остаётся интерактивная сессия:
>>> x + 1 42 >>> text 'значение' >>> exit()
Переменные видны для проверки в командной строке интерпретатора.
Как запустить отладчик pdb для файла .py?
def divide(a, b):
return a / b
print(divide(2, 0))
python -m pdb debug_script.py
> debug_script.py(1)<module>()
-> def divide(a, b):
(Pdb) continue
Traceback (most recent call last):
File "debug_script.py", line 4, in <module>
print(divide(2, 0))
File "debug_script.py", line 2, in divide
return a / b
ZeroDivisionError: division by zero
Режим pdb предоставляет команды для пошагового прохода, просмотра стека и изменения переменных.
Как запустить tracing и увидеть порядок выполнения строк?
def greet(name):
return 'Hello ' + name
print(greet('Python'))
python -m trace --trace trace_demo.py
--- modulename: trace_demo, funcname: <module>
trace_demo.py(1): def greet(name):
trace_demo.py(4): print(greet('Python'))
--- modulename: trace_demo, funcname: greet
trace_demo.py(2): return 'Hello ' + name
Hello Python
Вывод показывает каждую исполняемую строку и порядок вызова функций.
Как исполнить файл через runpy с проверкой данных?
# calc_data.py
first = 6
second = 7
product = first * second
import runpy
namespace = runpy.run_path('calc_data.py')
print(namespace['product'])
42
Функция возвращает словарь глобальных переменных, поэтому данные из скрипта доступны без повторного чтения файла.
Как запустить дочерний процесс с переменными окружения?
import os
import subprocess
import sys
env = os.environ.copy()
env['APP_MODE'] = 'test'
process = subprocess.run(
[sys.executable, 'env_app.py'],
env=env,
capture_output=True,
text=True
)
print('stdout:', process.stdout)
print('stderr:', process.stderr)
Содержимое файла env_app.py:
import os
print('Mode:', os.getenv('APP_MODE', 'default'))
stdout: Mode: test stderr:
Скопированный словарь окружения позволяет менять переменные только для дочернего процесса.
Как загрузить файл через compile и exec с указанием имени для traceback?
with open('compiled_script.py', encoding='utf-8') as f:
code = compile(f.read(), 'compiled_script.py', 'exec')
exec(code)
Содержимое файла compiled_script.py:
# compiled_script.py
print('compiled execution')
compiled execution
Второй аргумент compile задаёт имя файла в сообщениях об ошибках.
Как запустить скрипт в фоне с записью вывода в файл?
import time
for i in range(5):
print('iteration', i)
time.sleep(0.5)
Команда в shell:
nohup python background_demo.py > output.log 2>&1 &
Терминал сразу возвращает управление, вывод попадает в файл output.log.
[1] 12345
Номер PID в выводе отличается для каждого запуска.
Как запустить асинхронный дочерний процесс?
import asyncio
import sys
async def main():
process = await asyncio.create_subprocess_exec(
sys.executable, 'async_child.py',
stdout=asyncio.subprocess.PIPE,
stderr=asyncio.subprocess.PIPE
)
stdout, stderr = await process.communicate()
print('stdout:', stdout.decode())
if stderr:
print('stderr:', stderr.decode())
asyncio.run(main())
Содержимое файла async_child.py:
# async_child.py
print('async child')
stdout: async child
Модуль asyncio позволяет встраивать запуск других скриптов в событийный цикл приложения.
Как выполнить файл в режиме оптимизации?
assert 1 == 2, 'Ошибка в assert'
print('Оптимизация исключила проверку')
python -O optimize_demo.py
Оптимизация исключила проверку
Параметр -O удаляет инструкции assert и устанавливает __debug__ равным False.
Как включить предупреждения и режим разработчика?
import warnings
warnings.warn('Устаревший вызов', DeprecationWarning)
python -X dev dev_warning.py
dev_warning.py:2: DeprecationWarning: Устаревший вызов
Параметр -X dev включает дополнительные проверки памяти и предупреждения Python.