Eigenes Python installieren: Unterschied zwischen den Versionen

Aus Hostsharing Wiki
Zur Navigation springen Zur Suche springen
KKeine Bearbeitungszusammenfassung
 
(2 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 12: Zeile 12:


Ich installiere ein eigenes Python (hier Python 3.11) so:
Ich installiere ein eigenes Python (hier Python 3.11) so:
 
<syntaxhighlight lang=shell>
  mkdir /home/pacs/xyz00/opt
mkdir /home/pacs/xyz00/opt
  mkdir /home/pacs/xyz00/build
mkdir /home/pacs/xyz00/build
  cd /home/pacs/xyz00/build
cd /home/pacs/xyz00/build
  wget https://www.python.org/ftp/python/3.11.3/Python-3.11.3.tgz
wget https://www.python.org/ftp/python/3.11.3/Python-3.11.3.tgz
  tar xzf Python-3.11.3.tgz
tar xzf Python-3.11.3.tgz
  cd Python-3.11.3.tgz
cd Python-3.11.3.tgz
  ./configure --enable-optimizations --prefix=/home/pacs/xyz00/opt
./configure --enable-optimizations --prefix=/home/pacs/xyz00/opt
  make
make
  make install
make install
  cd ..
cd ..
  rm -rf build
rm -rf build
</syntaxhighlight>


Die folgenden Pfade sollten in der Datei <code>.profile</code> zum Ausführungspfad hinzugefügt werden:
Die folgenden Pfade sollten in der Datei <code>.profile</code> zum Ausführungspfad hinzugefügt werden:
 
<syntaxhighlight lang=shell>
  export PATH=$HOME/opt/bin:$HOME/.local/bin:$PATH
export PATH=$HOME/opt/bin:$HOME/.local/bin:$PATH
 
</syntaxhighlight>
Dann sollten noch die Programme pip und pipenv für die neue Pythonversion installiert werden:
Dann sollten noch die Programme pip und pipenv für die neue Pythonversion installiert werden:
 
<syntaxhighlight lang=shell>
  # setze den neuen Pfad
# setze den neuen Pfad
  . ~/.profile
. ~/.profile
  python3 -m pip install --user --upgrade pip pipenv
python3 -m pip install --user --upgrade pip pipenv
 
</syntaxhighlight>
= Installation mit pyenv =
= Installation mit pyenv =


Zeile 44: Zeile 45:


{{Textkasten|gelb|Hinweis für lokale Installation|Falls ihr z.B. für Ansible lokal auf eurem eigenen Rechner eine neuere Version von Python installieren wollt, werden folgende Pakete benötigt:
{{Textkasten|gelb|Hinweis für lokale Installation|Falls ihr z.B. für Ansible lokal auf eurem eigenen Rechner eine neuere Version von Python installieren wollt, werden folgende Pakete benötigt:
 
<syntaxhighlight lang=shell>
apt-get -y install libssl-dev libbz2-dev libncurses-dev libffi-dev libreadline-dev libsqlite3-dev liblzma-dev zlib1g-dev
apt-get -y install libssl-dev libbz2-dev libncurses-dev libffi-dev libreadline-dev libsqlite3-dev liblzma-dev zlib1g-dev
 
</syntaxhighlight>
Diese Pakete sind bei Hostsharing bereits installiert.
Diese Pakete sind bei Hostsharing bereits installiert.
}}
}}


Hier die Befehle, die ausgeführt werden müssen:
Hier die Befehle, die ausgeführt werden müssen:
 
<syntaxhighlight lang=shell>
  git clone https://github.com/pyenv/pyenv.git ~/.pyenv
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
  echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.profile
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.profile
  echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.profile
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.profile
  echo 'eval "$(pyenv init -)"' >> ~/.profile
echo 'eval "$(pyenv init -)"' >> ~/.profile
  source ~/.profile
source ~/.profile
  pyenv versions
pyenv versions
  pyenv version
pyenv version
  # siehe die aktuellen Versionen: https://www.python.org/downloads/
# siehe die aktuellen Versionen: https://www.python.org/downloads/
  pyenv install 3.10.11
pyenv install 3.10.11
  pyenv global 3.10
pyenv global 3.10
  python --version
python --version
 
</syntaxhighlight>
Um pipenv speziell mit dieser Python-Version zu installieren:
Um pipenv speziell mit dieser Python-Version zu installieren:
<syntaxhighlight lang=shell line>
pip install pipenv
pipenv install --python 3.10
</syntaxhighlight>


  pip install pipenv
= Python Web Applikation mit Passenger =
  pipenv install --python 3.10
 
== Python Web Applikation mit Passenger ==


Die Integration der eigenen Python-Installation in den Apache erfolgt über das  Apache-Modul "Passenger".
Die Integration der eigenen Python-Installation in den Apache erfolgt über das  Apache-Modul "Passenger".
Zeile 80: Zeile 82:


Für's Debugging ist die zusätzlich Option  
Für's Debugging ist die zusätzlich Option  
 
<syntaxhighlight lang=apache line>
  PassengerFriendlyErrorPages On
PassengerFriendlyErrorPages On
 
</syntaxhighlight>
hilfreich.
hilfreich.


Zeile 90: Zeile 92:
Eine minimale "passenger_wsgi.py" zur Anzeige der Python Version:
Eine minimale "passenger_wsgi.py" zur Anzeige der Python Version:


<pre>
<syntaxhighlight lang=python line>
#!/usr/bin/python3
#!/usr/bin/python3


Zeile 110: Zeile 112:


     return [bytes(output,'utf-8')]
     return [bytes(output,'utf-8')]
</pre>
</syntaxhighlight>


----
----

Aktuelle Version vom 24. Juni 2024, 17:01 Uhr

Motivation

Manchmal macht es Sinn eine eigene Python-Umgebung zu installieren. Gründe dafür können sein

  • Unabhängigkeit vom System-Python
  • Volle Kontrolle über eingesetzte Python-Packages
  • Freie Auswahl der Python-Distribution (z. B. die neueste)

Installation eines selbst kompilierten Pythons

Ich installiere ein eigenes Python (hier Python 3.11) so:

mkdir /home/pacs/xyz00/opt
mkdir /home/pacs/xyz00/build
cd /home/pacs/xyz00/build
wget https://www.python.org/ftp/python/3.11.3/Python-3.11.3.tgz
tar xzf Python-3.11.3.tgz
cd Python-3.11.3.tgz
./configure --enable-optimizations --prefix=/home/pacs/xyz00/opt
make
make install
cd ..
rm -rf build

Die folgenden Pfade sollten in der Datei .profile zum Ausführungspfad hinzugefügt werden:

export PATH=$HOME/opt/bin:$HOME/.local/bin:$PATH

Dann sollten noch die Programme pip und pipenv für die neue Pythonversion installiert werden:

# setze den neuen Pfad
. ~/.profile
python3 -m pip install --user --upgrade pip pipenv

Installation mit pyenv

Es gibt eine komfortable Möglichkeit, eigene Python Versionen zu installieren.

Das Werkzeug kommt aus der Ruby Welt, und ist ein Fork von rbenv.

Siehe auch https://github.com/pyenv/pyenv

Hinweis für lokale Installation

Falls ihr z.B. für Ansible lokal auf eurem eigenen Rechner eine neuere Version von Python installieren wollt, werden folgende Pakete benötigt:
apt-get -y install libssl-dev libbz2-dev libncurses-dev libffi-dev libreadline-dev libsqlite3-dev liblzma-dev zlib1g-dev

Diese Pakete sind bei Hostsharing bereits installiert.


Hier die Befehle, die ausgeführt werden müssen:

git clone https://github.com/pyenv/pyenv.git ~/.pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.profile
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.profile
echo 'eval "$(pyenv init -)"' >> ~/.profile
source ~/.profile
pyenv versions
pyenv version
# siehe die aktuellen Versionen: https://www.python.org/downloads/
pyenv install 3.10.11
pyenv global 3.10
python --version

Um pipenv speziell mit dieser Python-Version zu installieren:

pip install pipenv
pipenv install --python 3.10

Python Web Applikation mit Passenger

Die Integration der eigenen Python-Installation in den Apache erfolgt über das Apache-Modul "Passenger". Vor der Nutzung dieses Moduls bitte unbedingt die Hinweise zur Nutzung beachten.

Den Pfad zum Python-Binärprogramm konfiguriert man in den Eigenschaften der Domain in HSAdmin, unter PassengerPython: z.B. /home/pacs/xyz00/users/example/.pyenv/versions/3.9.18/bin/python3

(Versionsnummer, User und Paket im Pfad anpassen)

Für's Debugging ist die zusätzlich Option

PassengerFriendlyErrorPages On

hilfreich.

Zum Testen kann man eine "passenger_wsgi.py" ins Verzeichnis /home/pacs/xyz00/users/example/doms/example.com/app-ssl/ ablegen.

Eine minimale "passenger_wsgi.py" zur Anzeige der Python Version:

#!/usr/bin/python3

import sys
import os

def application(environ, start_response):
    status = '200 OK'
    path = os.environ['PATH']
    python_executable_path = sys.executable

    output = f"Hello World!\nThis is Python {sys.version}\n" + \
       f"with PATH {path}\n and executable {python_executable_path}"

    response_headers = [('Content-type', 'text/plain'),
                        ('Content-Length', str(len(output)))]

    start_response(status, response_headers)

    return [bytes(output,'utf-8')]