Как запустить скрипт, используя модуль subprocess и виртуальное окружение, из которого запущен основной скрипт?

  • 17 августа 2023 г. 10:26
Ответы на вопрос 2
Для того чтобы запустить скрипт, используя виртуальное окружение, можно воспользоваться модулем `subprocess` в сочетании с командой активации окружения перед запуском скрипта.

Вот пример кода:

```python
import subprocess
import sys

# Путь к скрипту, который нужно запустить
script_path = 'path/to/script.py'

# Переменная с путем к активации виртуального окружения
activate_env = 'source path/to/venv/bin/activate'

# Создание команды для активации окружения и запуска скрипта
command = f'{activate_env} && python {script_path}'

# Запуск команды
subprocess.call(command, shell=True)
```

В данном примере мы создаем команду, включающую активацию виртуального окружения (`activate_env`) и запуск скрипта (`python script_path`). Затем мы используем `subprocess.call()` для запуска этой команды в новом процессе. 

Обратите внимание, что вам нужно указать правильные пути к вашему скрипту и виртуальному окружению в переменных `script_path` и `activate_env` соответственно. Также проверьте, что у вас есть права на выполнение файла активации окружения (`venv/bin/activate`).

Надеюсь, это поможет вам запустить скрипт с использованием нужного виртуального окружения.
Найдите следующий бинарник Python внутри виртуального окружения (venv) и замените его путь на 'python'. Однако, если вы ждете завершения скрипта, то можно использовать следующий хак:

```python
# my_script.py
import sys

def main(args: list[str]):
    """Тело скрипта здесь..."""

if __name__ == '__main__':
    # скрипт запущен независимо
    main(sys.argv[1:])
```

В главном скрипте просто добавьте:

```python
import my_script

my_script.main(['--work-dir', work_dir, '--result-dir', result_dir])
```

Таким образом, вам не придется сильно изменять код в my_script, но теряется удобство вызова, например, если нужно получить значение из этого скрипта. Чем больше вы извлекаете из main() в отдельные подпрограммы, тем больше контроля будет у главного скрипта, но и тем больше работы.
Похожие вопросы