Вызов и выполнение кода одного скрипта Python из другого
Быстрый ответ
Для вызова одного скрипта Python из другого вы можете использовать функцию subprocess.run()
:
import subprocess
subprocess.run(["python", "your_script.py"])
Эта команда запустит указанный вами скрипт (your_script.py
), так, как если бы вы выполняли его из командной строки.
Детали вызова скриптов на Python
Вызов одного скрипта из другого — типичная задача в Python. Важно придерживаться некоторых указаний, чтобы избежать проблем.
Импорт модуля Python
Для работы с взаимосвязанными скриптами можно преобразовать их в модули:
# service.py
import test1 # подключаем модуль test1.py
test1.some_function() # и вызываем функцию из модуля test1.py
Оба файла должны быть в одном и том же каталоге для возможности относительного импорта.
Проверка, является ли скрипт головной программой
Для того чтобы скрипт мог быть использован как импортируемый модуль или как самостоятельная программа, используйте конструкцию if __name__ == '__main__'
:
# test1.py
def main():
# Ваш код
pass
if __name__ == '__main__':
main() # скрипт запускается непосредственно
Этот подход позволяет контролировать поведение кода в зависимости от способа его использования.
Использование функции exec
Также возможно выполнить содержимое файла внутри текущего скрипта с помощью функции exec()
. Однако необходима предельная аккуратность, чтобы избежать проблем с пространствами имён:
exec(open('test1.py').read()) # может быть полезно, но требует аккуратности!
Используйте exec()
с осторожностью из-за возможных проблем с безопасностью.
Создание подпроцессов с помощью модуля subprocess
Модуль subprocess
обеспечивает управление процессами скриптов, сохраняя их изолированность друг от друга:
import subprocess
subprocess.call(['python', 'test1.py']) # "Звонок в скрипту. Ожидаем ответа!"
Более подробные сведения по использованию subprocess
можно найти в официальной документации.
Запуск скриптов с помощью модуля os
Если вы работаете с несложными задачами или нужна поддержка старых версий Python, может понадобиться функция os.system()
:
import os
os.system('python test1.py') # "Я тоже могу быть полезен!"
Для работы с os.system()
в системной переменной PATH должен быть прописан путь к интерпретатору Python.
Визуализация
Запуск скрипта можно сравнить с эстафетной гонкой: один скрипт (Script1) передаёт управление (палочку) другому скрипту (Script2), который забирает её и продолжает выполнение команд.
# Script1.py
import Script2 # передача управления
# Script2.py
def main():
print("Стартовал!")
Инкапсуляция логики в функцию main
В грамотно структурированном скрипте должна быть функция main()
. Её тоже можно вызвать из другого скрипта:
# test1.py
def main():
print("Я в функции main. Нравится?")
if __name__ == '__main__':
main()
# service.py
import test1
test1.main() # и мы вызываем эту функцию
Будьте осторожны при вызове других скриптов
При использовании вызова скриптов могут возникнуть определённые сложности...
Обеспечьте уникальность имен
Используйте уникальные имена для переменных и функций, чтобы избежать конфликтов имен.
Убедитесь в правильности рабочей директории
Местоположение скрипта имеет значение: если интерпретатор Python не обнаруживает скрипт, он не сможет его выполнить.
Правильно используйте импорты
Отличайте импортирование модулей от их прямого запуска, чтобы избежать неожиданных побочных эффектов.
Полезные материалы
- Модули — Документация Python — детали о модулях в Python.
- Выполнение скриптов на Python – Real Python — различные способы запуска кода Python.
- Запуск одного скрипта из другого – Stack Overflow — обсуждение методов вызова скриптов на Python.
- Автоматизация рутины с помощью Python — практические примеры автоматизации задач.
- subprocess — Управление подпроцессами – Документация Python — всё, что нужно знать о модуле subprocess.
- Глубокое погружение в систему импорта Python – Real Python — детально о работе с импортами в Python.