этому поводу :)
Господа, вопрос следующий.
Есть питоновый скрипт с загруженной версией библиотеки=2x, внутри которого через subprocess запускается другой питоновый скрипт , с другим венвом в котором установлена и грузится версия 1x.
Все проходит хорошо, ровно до того момента, пока не юзается встроенный метод в этой либе, которая проверяет, какая версия загружена, и т.к. 2х была запущена родительским скриптом, то в дочернем показывает что актуальная версия 2х.
Соответственно вопрос, как одним питоновым скриптом, запускать другой питоновый скрипт в другом венве, но чтобы библиотеки загруженные первым скриптом туда не протекали? :)
Это что-то очень странное Оно на самом деле так работает?
короче сейчас объясню, речь о TensorFlow. У меня крутится фласкапи с загруженным TF2, выполняются всякие задачки и т.п. И вот понадобилось на один из методов повесить TF1, я соответственно делаю свежий венв, в него устанавливаю нужные версии. Запускаю этот скрипт вызывая через subprocess, с указанием пути до нужного питона/венва. В одном из скриптов TF1 есть что-то типа if tf_version.is_tf2(): И он возвращает True, соответственно все идет не так как надо :)
Интересно А внутрь метода не заглядывал – как он получает версию?
а как запускаешь?
cmd_list = [ '/home/ubuntu/tf1_venv/bin/python3', inference_script_path, '--input_type=image_tensor', f'--pipeline_config_path={config_file_path}', f'--output_directory={output_folder}', f'--trained_checkpoint_prefix={last_model_path}' ] print(f'Start creating frozen graph') send_message(subprocess.run(cmd_list, stdout=subprocess.PIPE))
хм, ну, выглядит разумно (если tf1_venv действительно первый тф). Значит ТФ какое-то сильное колдунство делает
Вот я и грю в метод залезть надо посмотреть
ubuntu@ip-172-31-6-57:~/dev/MLdev$ source ~/tf1_venv/bin/activate (tf1_venv) ubuntu@ip-172-31-6-57:~/dev/MLdev$ python Python 3.6.9 (default, Mar 15 2022, 13:55:28) [GCC 8.4.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import tensorflow as tf >>> tf.__version__ '1.15.5'
а чтоб первый скрипт запустить, активейт делаешь? Он просто и PATH меняет и может ещё что
from tensorflow.python import tf2 # pylint: disable=import-outside-toplevel def is_tf1(): """Whether current TensorFlow Version is 1.X.""" return not tf2.enabled() def is_tf2(): """Whether current TensorFlow Version is 2.X.""" return tf2.enabled() нашел метод, но если сделать вот так: >>> from tensorflow.python import tf2 >>> tf2.enabled() False То есть к венву вопросов нет, он реально чистый и рабочий.
скорее всего где-то здесь собака порылась :)
А попробуй без активации сделать так
ubuntu@ip-172-31-6-57:~$ python3 Python 3.6.9 (default, Mar 15 2022, 13:55:28) [GCC 8.4.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> from tensorflow.python import tf2 Traceback (most recent call last): File "<stdin>", line 1, in <module> ModuleNotFoundError: No module named 'tensorflow' Тоже все чистое :) Скорее всего с PATH действительно, потому что в родительском скрипте много где добавляются значения туда
ну, у subprocess.run есть параметр про переменные окружения
Осталось как-то их динамически вытаскивать из другого venv х)
Обсуждают сегодня