Проблема создания новой виртуальной среды
Я пытаюсь выполнить задачу, в которой я должен запустить poetry virtual environments и выполнить некоторый код, который должен запустить свою виртуальную среду и выполнить в ней свой код.
Но есть проблема: виртуальная среда остается прежней.
import typer
def typer_main(path_to_bath: str = typer.Argument('test')):
subprocess.run(path_to_bath)
def script_main():
"""Точка входа для запуска скрипта."""
typer.run(typer_main)
if __name__ == '__main__':
script_main()
run.bat (C:\User\Documents\prj2)
cd path/to/prj2
poetry install
poetry show -v
runner.py
import subprocess
import typer
def typer_main(path_to_bath: str = typer.Argument('test')):
subprocess.run(path_to_bath)
def script_main():
"""Точка входа для запуска скрипта."""
typer.run(typer_main)
if __name__ == '__main__':
script_main()
start.bat
poetry install
poetry run python runner.py ./path/to/prj2/run.bat
poetry show -v
Запуск:
./start.bat
Вывод
(project1-py3.10) PS C:\Users\User\Documents\project1>./start.bat
(project1-py3.10) PS C:\Users\User\Documents\project1> poetry install
Installing dependencies from lock file
Package operations: 0 installs, 17 updates, 0 removals
...
(project1-py3.10) PS C:\Users\User\Documents\project1>poetry show -v
Using virtualenv: C:\Users\User\AppData\Local\pypoetry\Cache\virtualenvs\project1-lbkdIgRk-py3.10
...
(project1-py3.10) PS C:\Users\User\Documents\project1>cd C:\User\Documents\prj2
(project1-py3.10) PS C:\User\Documents\prj2>poetry show -v
Using virtualenv: C:\Users\User\AppData\Local\pypoetry\Cache\virtualenvs\project1-lbkdIgRk-py3.10
...
(project1-py3.10) PS C:\User\Documents\prj2> poetry install
Installing dependencies from lock file
Package operations: 0 installs, 16 updates, 0 removals
...
(project1-py3.10) PS C:\User\Documents\prj2>poetry show -v
Using virtualenv: C:\Users\User\AppData\Local\pypoetry\Cache\virtualenvs\project1-lbkdIgRk-py3.10
...
(project1-py3.10) PS C:\User\Documents\prj2>
Почему виртуальная среда не была изменена на новую виртуальную среду?
Ответы (1 шт):
Проблема была в том, что subprocess позволяет запускать другие процессы только под своим окружением poetry под которым был запущен скрипт. Это можно решить добавив deactivate для деактивации уже имеющегося окружения в файл run.bat и poetry shell для активации нового окружения.
Также есть более элегантное решение, в котором используется модуль os
import os
bat_file_path = r'C:\путь\к\вашему\файлу\ваш_файл.bat'
# Запуск .bat файла
exit_code = os.system(bat_file_path)
# Проверка результата выполнения
if exit_code == 0:
print("Файл успешно выполнен")
else:
print(f"Ошибка при выполнении файла. Код завершения: {exit_code}")
Здесь нет необходимости напрягаться по поводу активации и деактивации виртуального окружения, так как эта команда запустит отдельный процесс со своим окружением