Mamba - 可替代 Conda 的 Python 包管理工具
AI工程化 2024-08-04 08:35:22 阅读 54
文章目录
一、关于 Mamba二、安装 Mamba1、全新安装(推荐)(Miniforge2、现有`conda`安装(不推荐)3、Docker 镜像4、Conda libmamba 求解器
三、安装 Micromamba1、使用操作系统包管理器Homebrew
2、从 Mamba-org releases 安装1)自动安装(推荐)2)自我更新3)手动安装Linux 和 macOSWindows
3、Nightly builds4、Docker 镜像5、从源代码构建6、Shell 补全
四、概念1、Prefix/Environment2、根前缀3、基础环境4、激活/停用激活停用
五、Mamba 用户指南快速开始`mamba`与`conda`CLISpecification 文件Repoquery
六、Micromamba 用户指南快速入门Specification 文件简单文本规范文件Conda YAML 规范文件显式规范文件`conda-lock`YAML 规范文件
一、关于 Mamba
Mamba 是一个快速、强大、跨平台的包管理器。
它可以在 Windows、OS X 和 Linux(包括 ARM64 和 PPC64LE)上运行,并且与<code>conda软件包完全兼容并支持大多数 conda 命令。
文档:https://mamba.readthedocs.io/en/latest/index.html
相关文章/博客
如何评价mamba,是一个比conda更优秀的包管理器吗? (主要反馈就是 快)
https://www.zhihu.com/question/539017762
mamba-org
组织拥有多种 Mamba 风格:
mamba
:基于 Python 的 CLI,被认为是 conda
的 直接替代品,提供更快的速度和更可靠的环境解决方案micromamba
:基于纯 C++ 的 CLI,独立于单文件可执行文件中libmamba
:一个公开低级和高级 API 的 C++ 库,在其上构建了mamba
和 micromamba
。
注:在本文档中,Mamba
将指所有 flavors,而特定flavor 的详细信息将提及mamba
、micromamba
或libmamba
。
micromamba特别适合 CI 用例,但不仅限于此!
二、安装 Mamba
1、全新安装(推荐)(Miniforge
我们建议您从Miniforge 发行版>=Miniforge3-22.3.1-0
开始。
如果您需要旧版本的 Mamba,请使用 Mambaforge 发行版。
Miniforge 预配置了流行的conda-forge
通道,但您可以修改配置以使用您喜欢的任何通道。
安装成功后,您可以按照 mamba 用户指南中的说明使用 mamba 命令。
注意:
安装后,请确保您没有配置 Anaconda 默认通道。不要在base
环境中安装任何东西,因为这可能会破坏您的安装。详细信息请参见此处。
2、现有conda
安装(不推荐)
警告:不推荐这种安装 Mamba 的方式。我们强烈建议使用 Miniforge 方法(见上文)。
要获取 mamba
,只需从 conda-forge
通道 安装到基础环境中即可:
# NOT RECOMMENDED: This method of installation is not recommended, prefer Miniforge instead (see above)
# conda install -n base --override-channels -c conda-forge mamba 'python_abi=*=*cp*'
注:将 mamba 不支持安装到 base
之外的环境中。
3、Docker 镜像
除了 Miniforge 独立发行版(见上文)之外,还有 condaforge/miniforge3 docker 镜像:
docker run -it --rm condaforge/miniforge3:latest mamba info
4、Conda libmamba 求解器
为了获得与快速 Mamba 求解器完全兼容的 conda 体验, conda-libmamba-solver现在默认随 Conda 一起提供。只需使用最新版本的 Conda 即可享受速度提升。
三、安装 Micromamba
micromamba
是完全静态链接的、独立的、可执行的。这意味着base
环境完全是空的。
micromamba
的配置略有不同,即所有环境和缓存 都会默认创建在MAMBA_ROOT_PREFIX
环境变量下。
也没有预先配置micromamba 附带的 .condarc
/.mambarc
(但如果存在,它们仍然会被读取)。
1、使用操作系统包管理器
Homebrew
在 macOS 上,您可以micromamba
从Homebrew安装:
brew install micromamba
2、从 Mamba-org releases 安装
1)自动安装(推荐)
注:这是安装 micromamba 的推荐方法。
如果您使用的是 macOS、Linux 或 Windows 上的 Git Bash,有一种简单的方法可以安装micromamba
.只需在您喜欢的 shell 中执行安装脚本即可。
对于 Linux、macOS 或 Windows 上的 Git Bash,请使用以下命令安装:
"${ SHELL}" <(curl -L micro.mamba.pm/install.sh)
在 Windows Powershell 上,使用
Invoke-Expression ((Invoke-WebRequest -Uri https://micro.mamba.pm/install.ps1).Content)
2)自我更新
安装后,micromamba
可以更新
micromamba self-update
可以指定显式版本
micromamba self-update --version 1.4.6
3)手动安装
警告:这是针对高级用户的。
Linux 和 macOS
下载并解压可执行文件(来自官方 conda-forge 包):
确保安装了基本实用程序。我们需要curl
并tar
支持bzip2
.此外,您还需要一个基于 glibc 的系统,例如 Ubuntu、Fedora 或 Centos(Alpine Linux 本身无法运行)。
以下 magic URL 始终返回 micromamba 的最新可用版本,并且该bin/micromamba
部分是使用tar
.
# Linux Intel (x86_64):
curl -Ls https://micro.mamba.pm/api/micromamba/linux-64/latest | tar -xvj bin/micromamba
# Linux ARM64:
curl -Ls https://micro.mamba.pm/api/micromamba/linux-aarch64/latest | tar -xvj bin/micromamba
# Linux Power:
curl -Ls https://micro.mamba.pm/api/micromamba/linux-ppc64le/latest | tar -xvj bin/micromamba
# macOS Intel (x86_64):
curl -Ls https://micro.mamba.pm/api/micromamba/osx-64/latest | tar -xvj bin/micromamba
# macOS Silicon/M1 (ARM64):
curl -Ls https://micro.mamba.pm/api/micromamba/osx-arm64/latest | tar -xvj bin/micromamba
提取完成后,我们就可以使用micromamba二进制文件了。
如果您想在临时用例中快速使用 micromamba,您可以运行
export MAMBA_ROOT_PREFIX=/some/prefix # optional, defaults to ~/micromamba
eval "$(./bin/micromamba shell hook -s posix)"
此 shell 挂钩会修改您的 shell 变量以包含 micromamba 命令。
如果您想保留这些更改,可以通过运行 来自动将它们写入您的.bashrc
(或.zshrc
) 。这还允许您选择自定义 MAMBA_ROOT_ENVIRONMENT,这是包和 repodata 缓存所在的位置。./micromamba shell init ...
# Linux/bash:
./bin/micromamba shell init -s bash -p ~/micromamba # this writes to your .bashrc file
# sourcing the bashrc file incorporates the changes into the running session.
# better yet, restart your terminal!
source ~/.bashrc
# macOS/zsh:
./micromamba shell init -s zsh -p ~/micromamba
source ~/.zshrc
现在您可以激活基本环境并安装新软件包,或创建其他环境。
micromamba activate # this activates the base environment
micromamba install python=3.6 jupyter -c conda-forge
# or
micromamba create -n env_name xtensor -c conda-forge
micromamba activate env_name
专有的conda-forge设置可以配置为:
micromamba config append channels conda-forge
micromamba config set channel_priority strict
Windows
micromamba
也有 Windows 支持!对于 Windows,我们推荐 powershell。
以下是在PowerShell
.
Invoke-Webrequest -URI https://micro.mamba.pm/api/micromamba/win-64/latest -OutFile micromamba.tar.bz2
tar xf micromamba.tar.bz2
MOVE -Force Library\bin\micromamba.exe micromamba.exe
.\micromamba.exe --help
# You can use e.g. $HOME\micromambaenv as your base prefix
$Env:MAMBA_ROOT_PREFIX="C:\Your\Root\Prefix"code>
# Invoke the hook
.\micromamba.exe shell hook -s powershell | Out-String | Invoke-Expression
# ... or initialize the shell
.\micromamba.exe shell init -s powershell -p C:\Your\Root\Prefix
# and use micromamba directly
micromamba create -f ./test/env_win.yaml -y
micromamba activate yourenv
3、Nightly builds
您可以在 GitHub 上下载每个提交的完全静态链接的构建main
(滚动到“摘要”页面的底部): mamba-org/mamba
4、Docker 镜像
mambaorg /micromamba docker 镜像无需安装即可运行micromamba
:
docker run -it --rm mambaorg/micromamba:latest micromamba info
5、从源代码构建
注:这些指令目前不适用于 Windows,这需要更复杂的混合构建。有关 Windows 和 Unix 的最新说明,请参阅 micromamba-feedstock中的脚本。
要从源代码构建,请使用 Conda 兼容安装程序 ( conda
/ mamba
/ micromamba
/ rattler
/ pixi
) 安装开发依赖项。
micromamba create -n mamba --file dev/environment-micromamba-static.yml
micromamba activate -n mamba
在此环境中使用 CMake 来驱动构建:
cmake -B build/ \
-G Ninja \
${CMAKE_ARGS} \
-D CMAKE_BUILD_TYPE="Release" \code>
-D BUILD_LIBMAMBA=ON \
-D BUILD_STATIC=ON \
-D BUILD_MICROMAMBA=ON
cmake --build build/ --parallel
您将在“build/micromamba/micromamba”下找到可执行文件。可以对可执行文件进行条带化以消除其大小:
strip "build/micromamba/micromamba"
6、Shell 补全
目前,仅micromamba
在 bash
和 zsh
提供 shell 补全。
要激活它,只需运行以下命令即可:
micromamba shell completion
现在,在获取配置文件以考虑修改后,在任何打开的新 shell 或当前 shell 中都可以完成此操作。
source ~/.<shell>rc
输入命令时只需点击<TAB><TAB>
即可完成。
例如,以下命令将帮助您选择要激活的命名环境:
micromamba activate <TAB><TAB>
四、概念
Mamba
本文档中也广泛使用了一些概念。您应该从熟悉这些内容开始。
1、Prefix/Environment
在类 Unix 平台中,安装一个软件包括将文件放置在“安装前缀”的子目录中:
没有文件放置在安装前缀之外依赖项必须安装在相同的前缀(或优先级较低的标准系统前缀)中
注:Unix 上的示例:文件系统的根、<code>/usr/和/usr/local/
目录。
前缀是一个完全独立且可移植的安装*。*
为了与根前缀消除歧义,前缀通常称为目标前缀。如果没有显式的目标或根前缀,您可以假设它引用目标前缀。
环境只是目标前缀的另一个名称。
Mamba 的环境类似于 Pythonvirtualenv
和类似软件中的虚拟环境,但功能更强大,因为 Mamba 还管理本机依赖项并将虚拟环境概念推广到许多编程语言。
2、根前缀
当第一次下载包的索引以解析环境或包本身时,会生成一个缓存以加速将来的操作:
该索引有一个可配置的生存时间(TTL),在此期间它将被视为有效包优先硬链接到缓存位置
此缓存由基于相同*根前缀的所有环境或目标前缀共享。*基本上,该缓存目录是位于 $root_prefix/pkgs/
的子目录。
根前缀还提供了一种方便的结构来存储环境 $root_prefix/envs/
,即使您可以在其他地方自由创建环境。
3、基础环境
基本环境是位于 根前缀 的环境。
这是实施过程中留下的遗留环境conda
,目前仍被大量使用。
基本环境包含 conda
和 mamba
安装以及 Python 安装(因为需要 mamba
和 conda
Python 才能运行)。
mamba
和conda
本身是 Python 包,安装在基础环境中,使得 CLI 在基于此*基础环境的所有 激活环境中可用。
注:您不能使用基本create
环境,因为它已经是根前缀结构的一部分。直接在 base install
代替。
4、激活/停用
激活
环境的激活使其所有内容可供您的 shell 使用。它主要将目标前缀子目录添加到您的$PATH
环境变量中。
注:激活的实现取决于平台。
从另一个环境激活时,您可以选择stack
,或不在 当前激活的环境。
Stacking 将产生一个新的中间前缀:system prefix < base < env1 < env2
停用
停用是与 激活相反的操作,从 shell 中删除使环境内容可访问的内容。
五、Mamba 用户指南
mamba
是一个用于管理 conda
环境的CLI 工具。
如果您已经知道了conda
,您已经知道了mamba
!
快速开始
mamba create
命令创建一个新环境。
您可以通过调用以下命令,创建一个具有 nameofmyenv
名称的环境:
mamba create -n nameofmyenv <list of packages>
此过程完成后,您可以通过 mamba activate <nameofmyenv>
调用 activate 虚拟环境。
例如,要从 conda-forge
频道安装 JupyterLab 然后运行它,您可以使用以下命令:
mamba create -n myjlabenv jupyterlab -c conda-forge
mamba activate myjlabenv # activate our environment
jupyter lab # this will start up jupyter lab and open a browser
激活环境后,mamba install
可用于将更多软件包安装到环境中。
mamba activate myjlabenv
mamba install bqplot # now you can use bqplot in myjlabenv
mamba install "matplotlib>=3.5.0" cartopy # now you installed matplotlib with version>=3.5.0 and default version of cartopy
mamba
与conda
CLI
mamba
是一个直接替代品,并使用与 conda
相同的命令和配置选项。
您可以在conda
和 mamba
之间交换几乎所有命令:
mamba install ...
mamba create -n ... -c ... ...
mamba list
Specification 文件
mamba
支持与 相同的环境规范文件格式conda
。
注意:虽然micromamba
支持 conda-lock“统一”锁定文件,但 Mamba 目前不支持。
Repoquery
mamba 具有 conda
stock 之上的功能。要高效地查询存储库和查询包依赖关系,您可以使用 mamba repoquery
。
这里有些例子:
# will show you all available xtensor packages.
$ mamba repoquery search xtensor
# you can also specify more constraints on this search query
$ mamba repoquery search "xtensor>=0.18"
# will show you a list of the direct dependencies of xtensor.
$ mamba repoquery depends xtensor
# will show you a list of the dependencies (including dependencies of dependencies).
$ mamba repoquery depends xtensor --recursive
--recursive
标志还显示依赖包的递归(即传递)依赖关系,而不仅仅是直接依赖关系。
通过 -t,--tree
标志,您可以在树中获得与递归查询相同的信息。
$ mamba repoquery depends -t xtensor
xtensor == 0.21.5
├─ libgcc-ng [>=7.3.0]
│ ├─ _libgcc_mutex [0.1 conda_forge]
│ └─ _openmp_mutex [>=4.5]
│ ├─ _libgcc_mutex already visited
│ └─ libgomp [>=7.3.0]
│ └─ _libgcc_mutex already visited
├─ libstdcxx-ng [>=7.3.0]
└─ xtl [>=0.6.9,<0.7]
├─ libgcc-ng already visited
└─ libstdcxx-ng already visited
您可以使用 whoneeds
来要求相反的内容,即哪些软件包依赖于其他软件包(例如ipython
)。
$ mamba repoquery whoneeds ipython
Name Version Build Depends Channel
-------------------------------------------------------------------
jupyter_console 6.4.3 pyhd3eb1b0_0 ipython pkgs/main
ipykernel 6.9.1 py39haa95532_0 ipython >=7.23.1 pkgs/main
ipywidgets 7.6.5 pyhd3eb1b0_1 ipython >=4.0.0 pkgs/main
通过-t,--tree
标志,您可以在树中获取相同的信息。
$ mamba repoquery whoneeds -t ipython
ipython[8.2.0]
├─ jupyter_console[6.4.3]
│ └─ jupyter[1.0.0]
├─ ipykernel[6.9.1]
│ ├─ notebook[6.4.8]
│ │ ├─ widgetsnbextension[3.5.2]
│ │ │ └─ ipywidgets[7.6.5]
│ │ │ └─ jupyter already visited
│ │ └─ jupyter already visited
│ ├─ jupyter_console already visited
│ ├─ ipywidgets already visited
│ ├─ jupyter already visited
│ └─ qtconsole[5.3.0]
│ └─ jupyter already visited
└─ ipywidgets already visited
注:depends
和whoneeds
子命令 要求在您的环境中 安装指定的软件包,或者使用 -c,--channel
标志指定通道。
当search
使用子命令 而未明确指定通道(使用前面提到的标志)时,将考虑配置期间 设置的通道 来执行搜索。
六、Micromamba 用户指南
micromamba
是包管理器 mamba
的微型版本。
它是一个静态链接的 C++ 可执行文件,具有单独的命令行界面。
它不需要base
环境,也没有默认版本的 Python。
快速入门
micromamba
支持所有 mamba
或 conda
命令的子集,并从头开始实现命令行界面。
您可以使用以下命令 查看所有已实现的命令:micromamba --help
$ micromamba --help
Subcommands:
shell Generate shell init scripts
create Create new environment
install Install packages in active environment
update Update packages in active environment
repoquery Find and analyze packages in active environment or channels
remove Remove packages from active environment
list List packages in active environment
package Extract a package or bundle files into an archive
clean Clean package cache
config Configuration of micromamba
info Information about micromamba
constructor Commands to support using micromamba in constructor
env List environments
activate Activate an environment
run Run an executable in an environment
ps Show, inspect or kill running processes
auth Login or logout of a given host
search Find packages in active environment or channels
要激活环境,只需调用micromamba activate /path/to/env
,
或者,当它是根前缀中的命名环境时,您也可以使用 micromamba activate myenv
。
micromamba
期望找到 使用 $MAMBA_ROOT_PREFIX
设置的根前缀。您还可以使用 CLI 选项 -r,--root-prefix
来提供它。
命名环境,然后在
$MAMBA_ROOT_PREFIX/envs/
.
了解更多详细信息,请阅读配置。
激活环境后,您可以运行install
以将新包添加到环境中。
$ micromamba install xtensor -c conda-forge
使用create
,您还可以创建环境:
$ micromamba create -n xtensor_env xtensor xsimd -c conda-forge
__
__ ______ ___ ____ _____ ___ / /_ ____ _
/ / / / __ `__ \/ __ `/ __ `__ \/ __ \/ __ `/
/ /_/ / / / / / / /_/ / / / / / / /_/ / /_/ /
/ .___/_/ /_/ /_/\__,_/_/ /_/ /_/_.___/\__,_/
/_/
conda-forge/noarch [====================] (00m:01s) Done
conda-forge/linux-64 [====================] (00m:04s) Done
Transaction
Prefix: /home/wolfv/miniconda3/envs/xtensor_env
Updating specs:
- xtensor
- xsimd
Package Version Build Channel Size
────────────────────────────────────────────────────────────────────────
Install:
────────────────────────────────────────────────────────────────────────
_libgcc_mutex 0.1 conda_forge conda-forge/linux-64 Cached
_openmp_mutex 4.5 1_gnu conda-forge/linux-64 Cached
libgcc-ng 9.3.0 h5dbcf3e_17 conda-forge/linux-64 Cached
libgomp 9.3.0 h5dbcf3e_17 conda-forge/linux-64 Cached
libstdcxx-ng 9.3.0 h2ae2ef3_17 conda-forge/linux-64 Cached
xsimd 7.4.9 hc9558a2_0 conda-forge/linux-64 102 KB
xtensor 0.21.9 h0efe328_0 conda-forge/linux-64 183 KB
xtl 0.6.21 h0efe328_0 conda-forge/linux-64 Cached
Summary:
Install: 8 packages
Total download: 285 KB
────────────────────────────────────────────────────────────────────────
Confirm changes: [Y/n] ...
安装完成后,可以通过以下方式激活环境:
$ micromamba activate xtensor_env
Specification 文件
create
语法还允许您使用规范或环境文件(也称为规范文件)来轻松地重新创建环境。
支持的语法是:
简单的文本规格文件Conda YAML 规范文件显式规格文件conda-lock
YAML 规范文件
简单文本规范文件
该 txt
文件每行包含一个 spec。例如,可能看起来像:
xtensor
numpy 1.19
xsimd >=7.4
要使用此文件,请传递:
$ micromamba create -n from_file -f spec_file.txt -c conda-forge
注:您可以通过重复参数来传递多个文本规范文件-f,--file
。
Conda YAML 规范文件
更强大的是YAML
如下文件,因为它们已经包含所需的环境名称和要使用的通道:
name: testenv
channels:
- conda-forge
dependencies:
- python >=3.6,<3.7
- ipykernel >=5.1
- ipywidgets
它们的使用方式与文本文件相同:
$ micromamba create -f env.yml
注:CLI 选项将优先于规范文件中指定的目标前缀或通道。
注:您可以通过重复 -f,--file
参数,来传递多个 YAML
规范文件。
显式规范文件
使用conda
您可以生成显式环境锁定文件。为此,创建一个环境,激活它,然后执行:
$ conda list --explicit --md5
这些环境文件如下所示,并且精确地“固定”所需的包+版本+构建字符串。每个包还具有可重复性的校验和:
# This file may be used to create an environment using:
# $ conda create --name <env> --file <this file>
# platform: linux-64
@EXPLICIT
https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81
https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-9.3.0-h2ae2ef3_17.tar.bz2#342f3c931d0a3a209ab09a522469d20c
https://conda.anaconda.org/conda-forge/linux-64/libgomp-9.3.0-h5dbcf3e_17.tar.bz2#8fd587013b9da8b52050268d50c12305
https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-1_gnu.tar.bz2#561e277319a41d4f24f5c05a9ef63c04
https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-9.3.0-h5dbcf3e_17.tar.bz2#fc9f5adabc4d55cd4b491332adc413e0
https://conda.anaconda.org/conda-forge/linux-64/xtl-0.6.21-h0efe328_0.tar.bz2#9eee90b98fd394db7a049792e67e1659
https://conda.anaconda.org/conda-forge/linux-64/xtensor-0.21.8-hc9558a2_0.tar.bz2#1030174db5c183f3afb4181a0a02873d
要使用安装这样的文件micromamba
,只需再次传递该-f
标志:
$ micromamba create -n xtensor -f explicit_env.txt
注:显式规范文件是单平台的。
conda-lock
YAML 规范文件
使用conda-lock
,您可以生成锁定文件,该文件与显式规范文件一样,精确固定并包含每个包的校验和以实现可重复性。与显式规范文件不同,这些“统一”锁定文件是多平台的。
这些文件默认命名为 conda-lock.yml
,如下所示:
# This lock file was generated by conda-lock (https://github.com/conda/conda-lock). DO NOT EDIT!
#
# A "lock file" contains a concrete list of package versions (with checksums) to be installed. Unlike
# e.g. `conda env create`, the resulting environment will not change as new package versions become
# available, unless you explicitly update the lock file.
#
# Install this environment as "YOURENV" with:
# conda-lock install -n YOURENV --file conda-lock.yml
# To update a single package to the latest version compatible with the version constraints in the source:
# conda-lock lock --lockfile conda-lock.yml --update PACKAGE
# To re-solve the entire environment, e.g. after changing a version constraint in the source file:
# conda-lock -f environment.yml --lockfile conda-lock.yml
version: 1
metadata:
content_hash:
osx-64: c2ccd3a86813af18ea19782a2f92b5a82e01c89f64a020ad6dea262aae638e48
linux-64: 06e0621a9712fb0dc0b16270ddb3e0be16982b203fc71ffa07408bf4bb7c22ec
win-64: efee77261626b3877b9d7cf7bf5bef09fd8e5ddfc79349a5f598ea6c8891ee84
channels:
- url: conda-forge
used_env_vars: []
platforms:
- linux-64
- osx-64
- win-64
sources:
- environment.yml
package:
- name: _libgcc_mutex
version: '0.1'
manager: conda
platform: linux-64
dependencies: { }
url: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2
hash:
md5: d7c89558ba9fa0495403155b64376d81
sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726
category: main
optional: false
- name: ca-certificates
version: 2023.5.7
manager: conda
platform: linux-64
dependencies: { }
url: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2023.5.7-hbcca054_0.conda
hash:
md5: f5c65075fc34438d5b456c7f3f5ab695
sha256: 0cf1bb3d0bfc5519b60af2c360fa4888fb838e1476b1e0f65b9dbc48b45c7345
category: main
optional: false
要使用安装这样的文件micromamba
,只需再次传递该-f
标志:
$ micromamba create -n my-environment -f conda-lock.yml
2024-04-23(二) 雨夜蛙鸣
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。