python管理包管理工具pip使用,及使用pip創建虛擬環境
文章目錄:
- 1 pip的使用
- 1.1 pip的基礎使用
- 1.1.1 pip安裝庫包(pip install)
- 1.1.2 pip卸載庫包(pip uninstall)
- 1.1.3 pip升級庫包(pip install --U)
- 1.1.4 pip查看已經安裝的庫包(pip list)
- 1.1.5 pip 顯示庫包的相關信息(pip show)
- 1.1.6 pip搜索庫包(pip search)
- 1.2 pip其他常用命令
- 1.3 pip使用鏡像下載、更新庫包
- 2 pip創建虛擬環境
- 3 pip使用中出現的問題
- 3 conda的基礎使用
- 3.1 conda的基礎使用
- 3.1.1 conda安裝庫包(conda install)
- 3.1.2 conda卸載庫包(conda uninstall)
- 3.1.3 conda升級庫包(conda update)
- 3.1.4 conda查看已經安裝的庫包(conda list)
- 3.1.5 conda搜索庫包有哪些版本(conda search)
- 3.2 conda的其他常用命令
- 4 conda創建虛擬環境
- 5 用conda創建cuda和cudnn
1 pip的使用
pip是python自帶的一個庫包管理工具
,可以通過pip進行python包的安裝、更新、卸載、新建虛擬環境等操作
在命令行下,我們可以查看pip的常用命令如下:
C:\Users\93176>pip -h
Usage:
pip <command> [options]
Commands:
install Install packages.
download Download packages.
uninstall Uninstall packages.
freeze Output installed packages in requirements format.
list List installed packages.
show Show information about installed packages.
check Verify installed packages have compatible dependencies.
config Manage local and global configuration.
search Search PyPI for packages.
wheel Build wheels from your requirements.
hash Compute hashes of package archives.
completion A helper command used for command completion.
debug Show information useful for debugging.
help Show help for commands.
General Options:
-h, --help Show help.
--isolated Run pip in an isolated mode, ignoring environment variables and user configuration.
-v, --verbose Give more output. Option is additive, and can be used up to 3 times.
-V, --version Show version and exit.
-q, --quiet Give less output. Option is additive, and can be used up to 3 times (corresponding to
WARNING, ERROR, and CRITICAL logging levels).
--log <path> Path to a verbose appending log.
--proxy <proxy> Specify a proxy in the form [user:passwd@]proxy.server:port.
--retries <retries> Maximum number of retries each connection should attempt (default 5 times).
--timeout <sec> Set the socket timeout (default 500.0 seconds).
--exists-action <action> Default action when a path already exists: (s)witch, (i)gnore, (w)ipe, (b)ackup,
(a)bort.
--trusted-host <hostname> Mark this host or host:port pair as trusted, even though it does not have valid or any
HTTPS.
--cert <path> Path to alternate CA bundle.
--client-cert <path> Path to SSL client certificate, a single file containing the private key and the
certificate in PEM format.
--cache-dir <dir> Store the cache data in <dir>.
--no-cache-dir Disable the cache.
--disable-pip-version-check
Don't periodically check PyPI to determine whether a new version of pip is available for
download. Implied with --no-index.
--no-color Suppress colored output
--no-python-version-warning
Silence deprecation warnings for upcoming unsupported Pythons.
C:\Users\93176>
1.1 pip的基礎使用
基礎使用:
- 安裝庫包
- 更新庫包
- 卸載庫包
1.1.1 pip安裝庫包(pip install)
一、pip安裝庫包
1、pip安裝庫包
pip install package_name
2、pip安裝多個庫包,只要庫包的名字用空格隔開即可
pip install package_name1 package_name2 package_name3
3、pip安裝指定版本的庫包(注意使用==
)
pip install package_name==版本號
4、pip安裝一系列庫包
當要安裝的庫包特別多的時候,如果寫成命令可能也會很多,此時可以把要安裝的庫包名
及版本號
,寫到一個requirements.txt
文件下。
例如:requirements.txt中的內容如下:
alembic==0.8.6
bleach==1.4.3
click==6.6
dominate==2.2.1
Flask==0.11.1
Flask-Bootstrap==3.3.6.0
Flask-Login==0.3.2
Flask-Migrate==1.8.1
Flask-Moment==0.5.1
Flask-PageDown==0.2.1
Flask-Script==2.0.5
然後在使用-r
參數安裝requirements.txt
下的庫包即可。
pip install -r requirements.txt
二、pip install相關的其他參數
在使用pip install
的時候,還可以在後面添加其他的參數,使用如下命令查看:
pip install -h
C:\Users\93176>pip install -h
Usage:
pip install [options] <requirement specifier> [package-index-options] ...
pip install [options] -r <requirements file> [package-index-options] ...
pip install [options] [-e] <vcs project url> ...
pip install [options] [-e] <local project path> ...
pip install [options] <archive url/path> ...
Description:
Install packages from:
- PyPI (and other indexes) using requirement specifiers.
- VCS project urls.
- Local project directories.
- Local or remote source archives.
pip also supports installing from "requirements files", which provide
an easy way to specify a whole environment to be installed.
Install Options:
-r, --requirement <file> Install from the given requirements file. This option can be used multiple times.
-c, --constraint <file> Constrain versions using the given constraints file. This option can be used multiple
times.
--no-deps Don't install package dependencies.
--pre Include pre-release and development versions. By default, pip only finds stable
versions.
-e, --editable <path/url> Install a project in editable mode (i.e. setuptools "develop mode") from a local project
path or a VCS url.
-t, --target <dir> Install packages into <dir>. By default this will not replace existing files/folders in
<dir>. Use --upgrade to replace existing packages in <dir> with new versions.
--platform <platform> Only use wheels compatible with <platform>. Defaults to the platform of the running
system.
--python-version <python_version>
The Python interpreter version to use for wheel and "Requires-Python" compatibility
checks. Defaults to a version derived from the running interpreter. The version can be
specified using up to three dot-separated integers (e.g. "3" for 3.0.0, "3.7" for 3.7.0,
or "3.7.3"). A major-minor version can also be given as a string without dots (e.g. "37"
for 3.7.0).
--implementation <implementation>
Only use wheels compatible with Python implementation <implementation>, e.g. 'pp', 'jy',
'cp', or 'ip'. If not specified, then the current interpreter implementation is used.
Use 'py' to force implementation-agnostic wheels.
--abi <abi> Only use wheels compatible with Python abi <abi>, e.g. 'pypy_41'. If not specified,
then the current interpreter abi tag is used. Generally you will need to specify
--implementation, --platform, and --python-version when using this option.
--user Install to the Python user install directory for your platform. Typically ~/.local/, or
%APPDATA%\Python on Windows. (See the Python documentation for site.USER_BASE for full
details.)
--root <dir> Install everything relative to this alternate root directory.
--prefix <dir> Installation prefix where lib, bin and other top-level folders are placed
-b, --build <dir> Directory to unpack packages into and build in. Note that an initial build still takes
place in a temporary directory. The location of temporary directories can be controlled
by setting the TMPDIR environment variable (TEMP on Windows) appropriately. When passed,
build directories are not cleaned in case of failures.
--src <dir> Directory to check out editable projects into. The default in a virtualenv is "<venv
path>/src". The default for global installs is "<current dir>/src".
-U, --upgrade Upgrade all specified packages to the newest available version. The handling of
dependencies depends on the upgrade-strategy used.
--upgrade-strategy <upgrade_strategy>
Determines how dependency upgrading should be handled [default: only-if-needed]. "eager"
- dependencies are upgraded regardless of whether the currently installed version
satisfies the requirements of the upgraded package(s). "only-if-needed" - are upgraded
only when they do not satisfy the requirements of the upgraded package(s).
--force-reinstall Reinstall all packages even if they are already up-to-date.
-I, --ignore-installed Ignore the installed packages, overwriting them. This can break your system if the
existing package is of a different version or was installed with a different package
manager!
--ignore-requires-python Ignore the Requires-Python information.
--no-build-isolation Disable isolation when building a modern source distribution. Build dependencies
specified by PEP 518 must be already installed if this option is used.
--use-pep517 Use PEP 517 for building source distributions (use --no-use-pep517 to force legacy
behaviour).
--install-option <options> Extra arguments to be supplied to the setup.py install command (use like --install-
option="--install-scripts=/usr/local/bin"). Use multiple --install-option options to
pass multiple options to setup.py install. If you are using an option with a directory
path, be sure to use absolute path.
--global-option <options> Extra global options to be supplied to the setup.py call before the install command.
--compile Compile Python source files to bytecode
--no-compile Do not compile Python source files to bytecode
--no-warn-script-location Do not warn when installing scripts outside PATH
--no-warn-conflicts Do not warn about broken dependencies
--no-binary <format_control>
Do not use binary packages. Can be supplied multiple times, and each time adds to the
existing value. Accepts either :all: to disable all binary packages, :none: to empty the
set, or one or more package names with commas between them (no colons). Note that some
packages are tricky to compile and may fail to install when this option is used on them.
--only-binary <format_control>
Do not use source packages. Can be supplied multiple times, and each time adds to the
existing value. Accepts either :all: to disable all source packages, :none: to empty the
set, or one or more package names with commas between them. Packages without binary
distributions will fail to install when this option is used on them.
--prefer-binary Prefer older binary packages over newer source packages.
--no-clean Don't clean up build directories.
--require-hashes Require a hash to check each requirement against, for repeatable installs. This option
is implied when any package in a requirements file has a --hash option.
--progress-bar <progress_bar>
Specify type of progress to be displayed [off|on|ascii|pretty|emoji] (default: on)
Package Index Options:
-i, --index-url <url> Base URL of the Python Package Index (default https://pypi.tuna.tsinghua.edu.cn/simple).
This should point to a repository compliant with PEP 503 (the simple repository API) or
a local directory laid out in the same format.
--extra-index-url <url> Extra URLs of package indexes to use in addition to --index-url. Should follow the same
rules as --index-url.
--no-index Ignore package index (only looking at --find-links URLs instead).
-f, --find-links <url> If a url or path to an html file, then parse for links to archives. If a local path or
file:// url that's a directory, then look for archives in the directory listing.
General Options:
-h, --help Show help.
--isolated Run pip in an isolated mode, ignoring environment variables and user configuration.
-v, --verbose Give more output. Option is additive, and can be used up to 3 times.
-V, --version Show version and exit.
-q, --quiet Give less output. Option is additive, and can be used up to 3 times (corresponding to
WARNING, ERROR, and CRITICAL logging levels).
--log <path> Path to a verbose appending log.
--proxy <proxy> Specify a proxy in the form [user:passwd@]proxy.server:port.
--retries <retries> Maximum number of retries each connection should attempt (default 5 times).
--timeout <sec> Set the socket timeout (default 500.0 seconds).
--exists-action <action> Default action when a path already exists: (s)witch, (i)gnore, (w)ipe, (b)ackup,
(a)bort.
--trusted-host <hostname> Mark this host or host:port pair as trusted, even though it does not have valid or any
HTTPS.
--cert <path> Path to alternate CA bundle.
--client-cert <path> Path to SSL client certificate, a single file containing the private key and the
certificate in PEM format.
--cache-dir <dir> Store the cache data in <dir>.
--no-cache-dir Disable the cache.
--disable-pip-version-check
Don't periodically check PyPI to determine whether a new version of pip is available for
download. Implied with --no-index.
--no-color Suppress colored output
--no-python-version-warning
Silence deprecation warnings for upcoming unsupported Pythons.
C:\Users\93176>
1.1.2 pip卸載庫包(pip uninstall)
1、直接卸載庫包
pip uninstall package_name
2、直接卸載多個庫包
pip uninstall package_name1 package_name2 package_name3
3、卸載一些列的包
pip uninstall -r requirements.txt
1.1.3 pip升級庫包(pip install --U)
pip升級庫包有兩種方式:
pip install -U package_name
pip install --upgrade package_name
1.1.4 pip查看已經安裝的庫包(pip list)
1、pip列出所有已經安裝的庫包
pip list
會列出所有已經安裝python庫包的:
- 庫包的名字
- 庫包的版本號
2、pip 查詢可升級
的庫包
pip list -o
3、pip list
的更多參數使用
pip list -h
1.1.5 pip 顯示庫包的相關信息(pip show)
1、pip顯示庫包的相關信息
pip show package_name
C:\Users\93176>pip show pillow
Name: Pillow
Version: 6.2.1
Summary: Python Imaging Library (Fork)
Home-page: http://python-pillow.org
Author: Alex Clark (PIL Fork Author)
Author-email: aclark@python-pillow.org
License: HPND
Location: c:\programdata\anaconda3\lib\site-packages
Requires:
Required-by: visdom, torchvision, streamlit, scikit-image, pytesseract
或列出庫包的如下相關信息:
- 庫包的名字
- 庫包的版本
- 庫包的主頁
- 庫包的下載位置
- 庫包的依賴庫等信息
1.1.6 pip搜索庫包(pip search)
查找和某個庫包關鍵字,查找和該關鍵字相關的所有庫包
pip search 待搜索的關鍵字
eg: pip install opencv
1.2 pip其他常用命令
1.2.1 pip虛擬環境中的庫包遷移
1、進入虛擬環境中:
cd virualenv_name
activate
2、把虛擬環境中庫包版本寫到requirements.txt
文件中
(venv)$pip freeze >requirements.txt
3、當要創建一個虛擬相同的副本
,可以創建一個虛擬環境,然後運行如下命令:
(venv)$pip install -r requirements
1.3 pip使用鏡像下載、更新庫包
1.3.1 臨時使用:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple torch
常用的國內鏡像源:
清華鏡像源:http://pypi.douban.com/simple/
豆瓣鏡像源:http://pypi.douban.com/simple/
阿里雲鏡像源:http://mirrors.aliyun.com/pypi/simple/
中國科學技術大學鏡像源: http://pypi.mirrors.ustc.edu.cn/simple/
華中理工大學鏡像源:http://pypi.hustunique.com/
山東理工大學鏡像源:http://pypi.sdutlinux.org/
1.3.2 一勞永逸的做法:
一、windows下添加鏡像源配置
在用戶目錄下修改pip\pip.ini
文件(我的用戶目錄:C:\Users\93176\pip\pip.ini)更改下載源地址,在pip.ini文件
中添加如下兩行代碼即可:
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
也可以在pip.ini文件
中加入timeout = 500
在網絡不好的時候,防止下載等待時間過短而中斷,可以設置超時時間。
參考
二、linux
下添加鏡像源配置
linux下,修改 ~/.pip/pip.conf (沒有就創建一個), 修改 index-url至tuna,內容如下:
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
2 pip創建虛擬環境
2.1 pip在windows上創建虛擬環境
2.1.1 安裝virtualenv
打開windows的命令行,安裝virtualenv
,virtualenv是創建python虛擬環境的一個工具
pip installl virtualenv
pip install virtualenvwrapper
# 這是對virtualenv的封裝版本,一定要在virtualenv後安裝
安裝完之後,輸入pip list可以查看到安裝的上面兩個庫包
2.1.2 使用virtualenv創建虛擬 環境
1、創建一個虛擬環境
virtualenv envname
如果安裝了多個python版本,如py2和py3,需要指定使用哪個創建虛擬環境
virtualenv -p python2 envname
此時會創建一個虛擬環境名字爲:envname
(也是envname文件夾
),然後在envname文件夾下有四個文件夾:
Include
Lib
:之後虛擬環境中安裝的庫包都會安裝到這裏Scripts
tcl
2、啓動虛擬環境
cd envname
# 進入虛擬環境文件夾
cd Scripts
# 進入相關啓動文件夾
activate
# 啓動虛擬環境
3、退出虛擬環境
deactivate
具體操作實例:
E:\pip_env>virtualenv opencv3
E:\pip_env>cd opencv3
E:\pip_env\opencv3>dir
2019/10/13 21:08 <DIR> Include
2020/04/11 11:52 <DIR> Lib
2020/04/11 12:16 <DIR> Scripts
2020/04/11 11:52 <DIR> tcl
E:\pip_env\opencv3>cd Scripts
E:\pip_env\opencv3\Scripts>dir
2020/04/11 12:16 2,301 activate
2020/04/11 12:16 871 activate.bat
2020/04/11 12:16 1,755 activate.ps1
2020/04/11 12:16 1,152 activate.xsh
2020/04/11 12:16 1,517 activate_this.py
2020/04/11 12:16 510 deactivate.bat
2020/04/11 11:53 102,776 easy_install-3.6.exe
2020/04/11 11:53 102,776 easy_install.exe
2020/04/11 11:53 102,767 pip.exe
2020/04/11 11:53 102,767 pip3.6.exe
2020/04/11 11:53 102,767 pip3.exe
2020/04/11 11:52 93,696 python.exe
2020/04/11 11:52 51,200 python3.dll
2020/04/11 11:52 3,603,456 python36.dll
2020/04/11 11:52 92,160 pythonw.exe
2020/04/11 11:53 102,754 wheel.exe
E:\pip_env\opencv3\Scripts>activate
# 進入虛擬環境
(opencv3) E:\pip_env\opencv3\Scripts>
# 退出虛擬環境
(opencv3) E:\pip_env\opencv3\Scripts>deactivate
E:\pip_env\opencv3\Scripts>
參考:https://www.cnblogs.com/cwp-bg/p/python.html
2.2 pip在linux上創建虛擬環境
linux中使用virtualenv
安裝虛擬環境和windows
中一樣
3 pip使用中出現的問題
3.1 pip安裝出現問題
3.1.1 pip安裝超時
pip安裝超時,一般是由於網絡的不好,導致長時間請求未能下載安裝包,解決方法時添加--timeout
,默認值爲500 seconds
,你可以試着更大一些。
1、臨時設置超時參數
pip install --timeout 600 package_name
2、永久配置超時參數
在上面的提到下載時,在配置文件中添加鏡像源,我們只要在配置文件再添加一行代碼即可:
timeout 700
超時時間可以自己設置,這樣就可以實現永久配置
3 conda的基礎使用
3.1 conda的基礎使用
1.2 conda常用的命令。
1)conda list 查看安裝了哪些包。
2)conda env list 或 conda info -e 查看當前存在哪些虛擬環境
3)conda update conda 檢查更新當前conda
3.1.1 conda安裝庫包(conda install)
conda install package_name
3.1.2 conda卸載庫包(conda uninstall)
conda uninstall package_name
3.1.3 conda升級庫包(conda update)
conda update package_name
3.1.4 conda查看已經安裝的庫包(conda list)
conda list
查看指定的某一個庫包的版本信息
conda list package_name
3.1.5 conda搜索庫包有哪些版本(conda search)
conda search package_name
3.2 conda的其他常用命令
3.2.1 conda批量導出導出依賴包並批量安裝
1、conda批量導出依賴包
conda list -e > requirements.txt
比如如果有一個虛擬環境,就可以直接把虛擬環境中所有庫包的版本信息導出到requirements.txt文件
中(記住:要先切換到虛擬環境中
),然後在使用下面的命令進行批量安裝,就可以快速復刻
一個一模一樣的虛擬環境。
2、conda批量安裝依賴包
conda install --yes --file requirements.txt
3.2.2 更新conda的版本
conda update -n base conda
3.2.3 conda查看、添加、刪除鏡像源
1、conda查看鏡像源
conda config --show-source
2、conda添加鏡像源
如下我們添加清華的鏡像源:
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
添加第三方的庫([參考],例如添加Pytorch
(https://blog.csdn.net/qq_29007291/article/details/81103603)):
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/
添加中科大鏡像源
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/cloud/conda-forge/
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/cloud/msys2/
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/cloud/bioconda/
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/cloud/menpo/
conda config --set show_channel_urls yes
也可以在配置文件中修改鏡像源,將以上配置文件寫在~/.condarc
中
vim ~/.condarc
# LInux環境下
channels:
- https://mirrors.ustc.edu.cn/anaconda/pkgs/main/
- https://mirrors.ustc.edu.cn/anaconda/cloud/conda-forge/
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
- defaults
show_channel_urls: true
讓添加的鏡像生效:
conda config --set show_channel_urls yes
3、刪除鏡像源
conda config --remove-key channels
刪除指定的鏡像源:
conda config --remove channels 'https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/'
4 conda創建虛擬環境
4.1 conda在linux、windows上創建虛擬環境
首先在所在系統中安裝Anaconda。可以打開命令行輸入
conda -V
檢驗是否安裝以及當前conda的版本。
1、創建python虛擬環境
conda create -n your_env_name python=X.X(2.7、3.6等)
- 創建python版本爲X.X
- 虛擬環境的名字爲:your_env_name
- your_env_name文件可以在Anaconda安裝目錄envs文件下找到。
2、使用激活(或切換不同python版本)的虛擬環境
打開命令行輸入
python --version
可以檢查當前python的版本。
激活虛擬環境:
使用如下命令即可 激活你的虛擬環境(即將python的版本改變)。
Linux
:source activate your_env_name
(虛擬環境名稱)
Windows
:activate your_env_name
(虛擬環境名稱)
使用python --version 或 python -V可以檢查當前python版本是否爲想要的。
也可以用pip -V 查看當前python的版本和python安裝包的路徑,如下:
3、退出虛擬環境
Linux
: source deactivate
Windows
: deactivate
注意:
當你退出虛擬環境可能出現如下錯誤:
(base) zpp@estar-cvip:~$ source activate mmlab
(mmlab) zpp@estar-cvip:~$ source deactivate
-bash: deactivate: 沒有那個文件或目錄
此時你可以選擇使用conda退出虛擬環境:
conda deactivate
# 一般要求conda的版本在4.0以上
當然也可以使用conda activate env_name
激活虛擬環境
4、刪除虛擬環境
使用命令
conda remove -n your_env_name(虛擬環境名稱) --all
, 即可刪除。
更多和移除命令相關參數可以通過:conda remove -h 查看
刪除環境中的某個包
使用命令
conda remove --name your_env_name package_name
即可。
4.2 對虛擬環境中安裝額外的包。
使用命令
conda install -n your_env_name [package]
即可安裝package到your_env_name中
4.3 conda刪除虛擬環境
conda remove -n env_name --all
5 用conda創建cuda和cudnn
-
cd到安裝包所在目錄,安裝:bash Anaconda3-5.1.0-Linux-x86_64.sh
-
創建虛擬環境:conda create -n your_env_name python=3.6
-
激活虛擬環境:source activate your_env_name
-
添加conda國內鏡像:
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/
conda config --set show_channel_urls yes
- 安裝cuda和cudnn
安裝cuda:conda install cudatoolkit=8.0 -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/linux-64/
安裝cudnn:conda install cudnn=7.0.5 -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/linux-64/
注:
安裝conda完成後,輸入conda list,若出現未找到命令,則需修改環境變量:export PATH=~/anaconda3/bin:$PATH(此法每次開機後都要修改,也可修改配置文件永久生效)
每個不同鏡像網站裏面包含各種不同的下載包,可根據自己的需求打開查找對應的安裝包,
如cudatoolkit 8.0.3 在https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/linux-64/內,
則安裝命令如:conda install cudatoolkit=8.0 -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/linux-64/ 即可。
♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠