Pyenv — переключение между версиями Python и PySpark без жесткого кодирования путей к переменным среды для Python

У меня возникли проблемы с корректной работой разных версий PySpark на моем компьютере с Windows в сочетании с разными версиями Python, установленными через PyEnv.

Настройка:

  1. Я установил pyenv и позволил ему установить переменные среды (PYENV, PYENV_HOME, PYENV_ROOT и запись в PATH).
  2. Я установил Amazon Coretto Java JDK (jdk1.8.0_412) и установил переменную среды JAVA_HOME.
  3. Я скачал winutils.exe и Hadoop.dll отсюда и установил переменную среды HADOOP_HOME.
  4. Через pyenv я установил Python 3.10.10, а затем pyspark 3.4.1.
  5. Через pyenv я установил Python 3.8.10, а затем pyspark 3.2.1.

Python работает так, как ожидалось:

  • Я могу переключаться между разными версиями с помощью pyenv global <version>
  • Когда я использую python --version в PowerShell, он всегда показывает версию, которую я установил ранее с помощью pyenv.

Но у меня проблемы с PySpark.

Во-первых, я не могу запустить PySpark через консоль PowerShell, запустив pyspark >>> The term 'pyspark' is not recognized as the name of a cmdlet, function, script file.....

Что еще более досадно, мои репо-скрипты (с .venv, созданным с помощью pyenv и поэзии) также терпят неудачу:

  • Caused by: java.io.IOException: Cannot run program "python3": CreateProcess error=2, The system cannot find the file specified [...] Caused by: java.io.IOException: CreateProcess error=2, The system cannot find the file specified

Однако оба работают после того, как я добавляю следующие две записи в переменную среды PATH:

  • C:\Users\myuser\.pyenv\pyenv-win\versions\3.10.10
  • C:\Users\myuser\.pyenv\pyenv-win\versions\3.10.10\Scripts

но мне пришлось бы «жестко запрограммировать» версию Python – а это именно то, чего я не хочу делать при использовании pyenv.

Если я жестко запрограммирую путь, даже если переключусь на другую версию Python (pyenv global 3.8.10), как только я запущу pyspark в Powershell, версия PySpark 3.4.1 начнется с записи PATH среды для Python 3.10.10. Я также не могу ничего сделать с Python в командной строке, поскольку он всегда указывает на жестко закодированную версию Python, независимо от того, что я делаю с pyenv.

Я надеялся, что смогу запустить PySpark 3.2.1 из Python 3.8.10, который я только что «активировал» с помощью pyenv во всем мире.

Что мне нужно сделать, чтобы иметь возможность переключаться между установками Python (и, следовательно, между PySparks) с помощью pyenv без «жесткого кодирования» путей Python?

Пример скрипта PySpark:

from pyspark.sql import SparkSession
spark = (
    SparkSession
    .builder
    .master("local[*]")
    .appName("myapp")
    .getOrCreate()
)
data = [("Finance", 10),
        ("Marketing", 20),
        ]
df = spark.createDataFrame(data=data)
df.show(10, False)

Пробовали ли вы использовать отдельные виртуальные среды для версий pyspark? вы можете использовать что-то вроде pyenv-virtualenv

peeyush113 05.05.2024 16:55

Конечно, я использую virtualenv, и поэтика даже создает отдельные файлы для разных репозиториев. Но проблема здесь не в этом - проблема в том, что Windows не может вызывать версии Python/pyspark, динамически установленные pyenv, вместо этого мне приходится жестко запрограммировать переменные среды для определенных версий.

Cribber 06.05.2024 17:28
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
2
120
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я «решил» проблему, полностью удалив путь Python из переменной среды PATH и сделав все исключительно через pyenv. Поскольку даже награда за этот вопрос не принесла ответов, то, полагаю, это означает, что это невозможно.

Я все еще могу запустить процесс Python, запустив pyenv exec python в терминале.

Но, к сожалению, я больше не могу запустить искровой процесс с терминала.

По крайней мере, мои репозитории работают должным образом при установке версий pyenv (pyenv local 3.8.10/pyenv global 3.10.10).

Другие вопросы по теме