virtualenv
przy tworzeniu wirtualnych środowisk Python'aVirtualenv
to narzędzie do zarządzania oddzielnymi środowiskami Pythona dla różnych projektów. Umożliwia instalację pakietów w niezależnej lokalizacji, co pozwala uniknąć konfliktów między różnymi wersjami bibliotek wymaganymi przez poszczególne aplikacje.
Wirtualne środowiska są szczególnie przydatne w sytuacjach, gdy nie można instalować pakietów globalnie, np. na współdzielonych hostach. Dzięki nim każdy projekt może mieć własne, niezależne środowisko z odpowiednimi wersjami pakietów.
Do tworzenia środowiska wirtualnych dostępne są obecnie dwa narzędzia:venv
i virtualenv
.
Moduł venv
nie oferuje wszystkich funkcji virtualenv
.
Zalecamy zatem korzystanie z virtualenv
, który obsługuje Python 2 i Python 3+
Aby skorzystać z virtualenv
, należy uruchomić zadanie i załadować wybrany moduł Pythona.
Na partycjach
bem2-cpu
lem-cpu
ilem-gpu
każdy moduł Pythona zawiera narzędzievirtualenv
Jeśli po załadowaniu wybranej wersji Pythona nie można aktywować
virtualenv
, prosimy o zgłoszenie problemu na adres kdm@wcss.pl
virtualenv
virtualenv
pip
virtualenv
W poniższym przykładzie uruchamiamy zadanie interaktywne, sprawdzamy dostępność konkretnej wersji Pythona, a następnie ładujemy odpowiedni moduł:
[wcss] abc@r23c01b11 ~ > module av python
-------------------------------------------------- /usr/local/Modules --------------------------------------------------
Python/3.13.1-GCC-13.3.0 Python/3.13.1-GCC-14.2.0
------------------------------------------- /usr/local/easybuild/modules/all -------------------------------------------
Python-bundle-PyPI/2023.06-GCCcore-12.3.0 Python/2.7.18-GCCcore-11.2.0-bare Python/3.10.4-GCCcore-11.3.0
Python-bundle-PyPI/2023.10-GCCcore-13.2.0 Python/2.7.18-GCCcore-11.3.0-bare Python/3.10.4-GCCcore-11.3.0-bare
Python-bundle-PyPI/2024.06-GCCcore-13.3.0 Python/3.7.2-GCCcore-8.2.0 Python/3.10.8-GCCcore-12.2.0
Python/2.7.15-foss-2018b Python/3.7.4-GCCcore-8.3.0 Python/3.10.8-GCCcore-12.2.0-bare
Python/2.7.15-GCCcore-7.3.0-bare Python/3.8.2-GCCcore-9.3.0 Python/3.11.3-GCCcore-12.3.0
Python/2.7.15-GCCcore-8.2.0 Python/3.8.6-GCCcore-10.2.0 Python/3.11.5-GCCcore-13.2.0
Python/2.7.16-GCCcore-8.3.0 Python/3.9.5-GCCcore-10.3.0 Python/3.12.3-GCCcore-13.3.0
Python/2.7.18-GCCcore-9.3.0 Python/3.9.5-GCCcore-10.3.0-bare Python/3.13.1-GCCcore-14.2.0
Python/2.7.18-GCCcore-10.2.0 Python/3.9.6-GCCcore-11.2.0
Python/2.7.18-GCCcore-10.3.0-bare Python/3.9.6-GCCcore-11.2.0-bare
[wcss] abc@r22c03b01 ~ > module load Python/3.11.3-GCCcore-12.3.0
Loading Python/3.10.4-GCCcore-11.3.0
Loading requirement: GCCcore/11.3.0 zlib/1.2.12-GCCcore-11.3.0 binutils/2.38-GCCcore-11.3.0 bzip2/1.0.8-GCCcore-11.3.0 ncurses/6.3- GCCcore-11.3.0
libreadline/8.1.2-GCCcore-11.3.0 Tcl/8.6.12-GCCcore-11.3.0 SQLite/3.38.3-GCCcore-11.3.0 XZ/5.2.5-GCCcore-11.3.0 GMP/6.2.1-GCCcore- 11.3.0libffi/3.4.2-GCCcore-11.3.0 OpenSSL/1.1
Komenda pip list
pozwala sprawdzić, jakie moduły są aktualnie zainstalowane w środowisku dla wybranej wersji Pythona
[wcss] abc@r22c03b01 ~ > pip list
Package Version
----------------------------- ----------
alabaster 0.7.12
...
virtualenv 20.0.18 # <<<<<<<<< wskazuje
wcwidth 0.1.9
wheel 0.34.2
Po załadowaniu wybranej wersji Pythona, powinno być dostępne narzędzie virtualenv
.
[wcss] abc@r22c03b04 ~ > virtualenv --version
virtualenv 20.14.1
[wcss] abc@r23c01b11 ~ > virtualenv <venvname>
created virtual environment CPython3.10.4.final.0-64 in 10436ms
creator ...
added seed packages: pip==22.0.4, setuptools==62.1.0, wheel==0.37.1 activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator
Jeśli pojawi się komunikat:
ERROR: Could not install packages due to an OSError: [Errno 122] Disk quota exceeded
zalecamy skorzystanie z PD (Przestrzeni dyskowej] Usługi "Przetwórz na superkomputerze".
PD to dedykowane zasoby pamięci dyskowej przeznaczone do długoterminowego przechowywania danych.
Wybrana przez użytkownika nazwa (w przykładzie
venvname
) określa lokalizację katalogów instalacyjnych wirtualnego środowiska (podanie absolutnej ścieżki spowoduje utworzenie środowiska dokładnie w tym miejscu). Jeśli podamy tylko nazwę, katalogi obsługujące środowisko wirtualne zostaną wygenerowane w bieżącej lokalizacji.
[wcss] abc@r23c01b11 ~ > source <venvname>/bin/activate
(venvname) wskazuje, że poruszamy się i wywołujemy komendy wewnątrz stworzonego środowiska wirtualnego.
(venvname) [wcss] abc@r23c01b11 ~ > python --version
Python 3.10.4
Polecenie source
w powłokach Unix ustawia zmienne środowiskowe w bieżącej powłoce, a nie w podprocesie (który następnie znika, nie mając żadnego użytecznego efektu).
(venvname) [wcss] abc@r23c01b11 ~ > pip install <package>==<version>
(venvname) [wcss] abc@r23c01b11 ~ > pip install <package> --upgrade
Używając pip install
w aktywowanym środowisku wirtualnym, pakiet zostanie zainstalowany w katalogu domowym środowiska wirtualnego i będzie dostępny tylko w jego obrębie.
Przykład:
(venvname) [wcss] abc@r23c01b11 ~ > pip install numpy pandas
Collecting numpy
Using cached numpy-1.24.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (17.3 MB)
Installing collected packages: numpy
Successfully installed numpy-1.24.2
...
...
Polecenie pip list
pozwala wylistować wszystkie pakiety zainstalowane w środowisku, np. w venvname
Domyślnie w każdym nowo utworzonym środowisku wirtualnym instalowane są pakiety:
pip
,setuptools
,wheel
(venvname) [wcss] abc@r21c01b16 ~ > pip list
Package Version
---------- -------
numpy 1.24.2
pandas 1.5.3
pip 22.0.4
setuptools 62.1.0
wheel 0.37.1
virtualenv
$ (venvname) [wcss] abc@r23c01b11 ~ > python </path/to/script>.py
$ (venvname) [wcss] abc@r23c01b11 ~ > deactivate
Virtualenv
w zadanich wsadowychNadmierna alokacja zasobów przez jednego użytkownika może uniemożliwić korzystanie z nich innym.
Dlatego prosimy o rozsądne i przemyślane planowanie rezerwacji oraz wykorzystania zasobów
sbatch
do utworzenia środowiska wirtualnegoPoniżej znajduje się przykładowy skrypt przygotowany do wykonania zadania.
Może on zawierać przykładowe parametry #SBATCH
:
#!/bin/bash
#SBATCH --job-name=MyJob
#SBATCH --output=result.out
#SBATCH --error=errlog.err
#SBATCH --mail-type=BEGIN,END,FAIL
#SBATCH --mail-user=<nameuser@pwr.edu.pl>
#SBATCH -N1
#SBATCH -c10
#SBATCH --mem=10G # Total memory per task (units: K,M,G,T)
#SBATCH --time=1:00:00
source /usr/local/sbin/modules.sh
module load Python/<version>
virtualenv <path/to/venvname>
source <path/to/venvname>/bin/activate
pip install <numpy> <pandas> <scipy> # SPACJĄ oddzielamy pakiety,które chcemy zainstalować
pip freeze > </path/to/requirements_name.txt> # opcjonalnie można wygenerować plik requirements.txt w wybranej lokalizacji
python </path/to/script.py>
Pod wskazaną ścieżką zostanie utworzone środowisko wirtualne o wybranej nazwie, wraz z opcjonalnym plikiem requirements_name.txt
.
W skrypcie wsadowym, korzystając z tego pliku, możemy odwtorzyć konkretną konfigurację pakietów, po uprzednim zdefiniowaniu parametrów #SBATCH
:
source /usr/local/sbin/modules.sh
module load Python/<version>
virtualenv <path/to/venvname>
source <path/to/venvname>/bin/activate
pip install -r </path/to/requirements_name.txt> # pobiera wskazane w pliku pakiety i biblioteki Pythona
python </path/to/script.py>
Ważne, aby wersja ładowanego modułu Pythona zgadzała się z wersją Pythona, na podstawie ktorej zostało utworzone środowisko virtualenv
.
Przykładowy skrypt:
#!/bin/bash
#SBATCH --job-name=MyJobName
#SBATCH --output=result.out
#SBATCH --error=errlog.err
#SBATCH --mail-type=BEGIN,END,FAIL
#SBATCH --mail-user=<nameuser@pwr.edu.pl>
#SBATCH -N1
#SBATCH -c10
#SBATCH --mem=10G # Total memory per task (units: K,M,G,T)
#SBATCH --time=1:00:00
source /usr/local/sbin/modules.sh
module load Python/<version>
source <path/to/your/virtualenv>/bin/activate
python <your_script.py>
Polecenie
source <venvname>/bin/activate
aktywuje utworzone środowisko wirtualne.
Należy je wykonać po załadowaniu odpowiedniego modułu Pythona i przed wykonaniem skryptu Pythona.
Tak przygotowane środowisko wirtualne można ponownie wykorzystać także w zadaniu interaktywnym srun
, pod warunkiem wcześniejszego zaladowania odpowiedniego modułu Pythona (module load <Python/x.x.x>
) oraz aktywacji środowiska ( source <nazwa_VE>/bin/activate
).
Możemy wielokrotnie korzystać z już stworzonego środowiska w zadaniach interaktywnych srun
, po załadowaniu odpowiedniego modułu Pythona (wersji, na podstawie której tworzylismy nasze środowisko wirtualnego z którego chcemy teraz ponownie skorzystać) po prostu uaktywniając je polceniem source
, jak było wskazane powyzej.
Przydatne jest rejestrowanie, jakie pakiety i w jakich wersjach zainstalowane w środowisku wirtualnym.
Polecenie pip freeze
wyświetla listę wszystkich pakietów wraz z ich wersjami.
Operator >
przekieruje dane wyjściowe tego polecenia do pliku w bieżacej lokalizacji - najczęsciej, zgodnie z konwencją, do pliku requirements.txt
(choć jego nazwa może być dowolna).
(venvname) [wcss] abc@r23c01b11 ~ > pip freeze > requirements.txt
(venvname) [wcss] abc@r23c01b11 ~ > cat requirements.txt
numpy==1.24.2
Plik requirements.txt
z listą pakietów i ich wersji można wykorzystać do ponownej instalacji pakietów w innym lub nowym środowisku wirtualnym. W tym celu używamy polecenia pip
z opcją -r
:
(venvname_NEW) [wcss] abc@r23c01b11 pip install -r requirements.txt
Jeśli plik requirements.txt
nie znajduje się w bieżącej lokalizacji, należy podać jego pełną ściezkę, np.:
(venvname_NEW) [wcss] abc@r21c01b16 ~ > pip install -r </home/nameuser/requirements.txt>
module
?Pełna wersja dokumentacji użytkownika WCSS znajduje się tutaj
Jeśli nie znajdziesz rozwiązania w powyżej dokumentacji, prosimy o kontakt z kdm@wcss.pl