<p>我并不认为这是完美的,但下面是我在实践中发现的非常强大的脚本:一个<code>install.sh</code>脚本,它最初是为一个名为<a href="https://github.com/overlap-ai/words2map" rel="nofollow">words2map</a>的人工智能库派生的。目标是确保用户可以简单地运行<code>./install.sh</code>,然后所有需要的<code>pip install this</code>和{<cd4>}在任何情况下都能成功(即使是对于全新的服务器),而不管您使用的是什么操作系统。(我真希望与操作系统无关的安装是行业标准的,至少在macosx和每个Linux发行版上是这样…)</p>
<p>请直接跳到代码,但是对于那些需要解释的人:这个<code>install.sh</code>脚本很大程度上依赖于<a href="https://www.continuum.io/downloads" rel="nofollow">Conda</a>包分发管理器,考虑到它自动构建特定于操作系统的轮子,它工作得非常好。下面的安装代码首先检查用户的操作系统,然后安装适当的Conda发行版(如果在macosx和Linux上,在本例中),然后根据需要通过Conda安装所有剩余的依赖项。另外,请注意,如果检测到一个Linux终端,它首先确保所需的编译库可以通过<code>sudo apt-get install python-dev</code>等方式获得(因为用户经常丢失<code>gcc</code>或其他东西),最后这会自动将Conda添加到用户的路径中,<code>bash</code>和{<cd9>},这似乎覆盖了大多数终端(但可能不需要添加)。有很多好处,但实际上这提供了一个非常好的UX,可以帮助用户立即启动并运行您正在分发的一个新的复杂Python库,因为您可以通过尝试立即下载并运行<a href="https://github.com/overlap-ai/words2map" rel="nofollow">words2map</a>为自己进行测试。如果对每个人都有意义/使其更好/更清晰,则强烈鼓励对此进行编辑。好了,开始节目吧!在</p>
<pre><code>#!/bin/bash
download_miniconda() {
echo "Downloading Miniconda for Python dependencies..."
OS_BIT_TYPE="$(uname -m)"
OS_ARCHITECTURE="$(uname -s)"
if [ $OS_BIT_TYPE == "i686" ]; then
OS_BIT_TYPE="x86"
fi
if [ $OS_ARCHITECTURE == "Darwin" ]; then
OS_ARCHITECTURE="MacOSX"
fi
MINICONDA_INSTALL_FILE="Miniconda2-latest-$OS_ARCHITECTURE-$OS_BIT_TYPE.sh"
MINICONDA_DOWNLOAD_URL="https://repo.continuum.io/miniconda/$MINICONDA_INSTALL_FILE"
$(curl -O $MINICONDA_DOWNLOAD_URL)
$(chmod +x $MINICONDA_INSTALL_FILE)
}
install_miniconda() {
echo "Installing Miniconda..."
echo "$(./$MINICONDA_INSTALL_FILE -b -p $HOME/miniconda)"
echo "$(rm $MINICONDA_INSTALL_FILE)"
}
confirm_miniconda_installed() {
if hash conda 2>/dev/null; then
echo "Miniconda installed!"
else
echo "Failed to install Miniconda. Please visit http://conda.pydata.org/docs/install/quick.html to install and then try rerunning this script, making sure that Miniconda is accessible in the PATH"
fi
}
update_script_startup_file() {
echo "if [[ \":\$PATH:\" != *\":\$HOME/miniconda/bin:\"* ]]; then" >> $STARTUP_FILE
echo " export PATH=\"\$PATH:\$HOME/miniconda/bin\"" >> $STARTUP_FILE
echo "fi" >> $STARTUP_FILE
}
add_miniconda_to_path() {
# temporary update to PATH for this script
export PATH="$PATH:$HOME/miniconda/bin"
# permanent update to PATH for user's convenience
if [ -n "`$SHELL -c 'echo $BASH_VERSION'`" ]; then
STARTUP_FILE="$HOME/.bashrc"
update_script_startup_file
elif [ -n "`$SHELL -c 'echo $ZSH_VERSION'`" ]; then
STARTUP_FILE="$HOME/.zshrc"
update_script_startup_file
else
echo "Couldn't automatically add Miniconda to the PATH of your preferred terminal. We suggest working from Bash or ZShell."
fi
}
install_conda_if_needed() {
if hash conda 2>/dev/null; then
echo "Miniconda installed!"
else
if ping -c 1 google.com >> /dev/null 2>&1; then
download_miniconda
install_miniconda
add_miniconda_to_path
confirm_miniconda_installed
else
echo "Looks like you're offline! Please address this and then try rerunning this script."
fi
fi
}
create_conda_environment() {
if hash conda 2>/dev/null; then
CONDA_ENVIRONMENTS="$(conda env list)"
if [[ "$CONDA_ENVIRONMENTS" != *"words2map"* ]]; then
conda create name words2map yes cython scikit-learn gensim seaborn
fi
fi
}
install_developer_libraries_as_needed() {
OS_ARCHITECTURE="$(uname -s)"
if [ $OS_ARCHITECTURE == "Linux" ]; then
echo "$(python -mplatform | grep -qi Ubuntu && sudo apt-get update && sudo apt-get install python-dev || sudo yum update -y && sudo yum install python-devel -y && sudo yum groupinstall "Development Tools" -y)"
fi
}
install_python_dependencies() {
if hash conda 2>/dev/null; then
echo 'Installing Python dependencies for words2map...'
source activate words2map
install_developer_libraries_as_needed
pip install hdbscan pattern semidbm nltk unidecode
source deactivate
fi
}
refresh_user_shell() {
if [ -n "`$SHELL -c 'echo $BASH_VERSION'`" ]; then
exec bash
elif [ -n "`$SHELL -c 'echo $ZSH_VERSION'`" ]; then
exec zsh
fi
}
install_conda_if_needed
create_conda_environment
install_python_dependencies
refresh_user_shell
</code></pre>