2024-09-28 13:28:46 发布
网友
如何确保分发依赖性大的Python包(如NumPy和SciPy)自动正确地安装在用户的计算机上,而不考虑用户的操作系统?在
问题是,许多这样的包或多或少都是通过pip的主通道安装的,包括上面提到的那些。。。在
pip
我并不认为这是完美的,但下面是我在实践中发现的非常强大的脚本:一个install.sh脚本,它最初是为一个名为words2map的人工智能库派生的。目标是确保用户可以简单地运行./install.sh,然后所有需要的pip install this和{}在任何情况下都能成功(即使是对于全新的服务器),而不管您使用的是什么操作系统。(我真希望与操作系统无关的安装是行业标准的,至少在macosx和每个Linux发行版上是这样…)
install.sh
./install.sh
pip install this
请直接跳到代码,但是对于那些需要解释的人:这个install.sh脚本很大程度上依赖于Conda包分发管理器,考虑到它自动构建特定于操作系统的轮子,它工作得非常好。下面的安装代码首先检查用户的操作系统,然后安装适当的Conda发行版(如果在macosx和Linux上,在本例中),然后根据需要通过Conda安装所有剩余的依赖项。另外,请注意,如果检测到一个Linux终端,它首先确保所需的编译库可以通过sudo apt-get install python-dev等方式获得(因为用户经常丢失gcc或其他东西),最后这会自动将Conda添加到用户的路径中,bash和{},这似乎覆盖了大多数终端(但可能不需要添加)。有很多好处,但实际上这提供了一个非常好的UX,可以帮助用户立即启动并运行您正在分发的一个新的复杂Python库,因为您可以通过尝试立即下载并运行words2map为自己进行测试。如果对每个人都有意义/使其更好/更清晰,则强烈鼓励对此进行编辑。好了,开始节目吧!在
sudo apt-get install python-dev
gcc
bash
#!/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
legel建议的问题在于,最终还是要依赖用户的环境来部署应用程序。在
在过去,我有类似的安装脚本,这些脚本会完成部署应用程序的所有繁琐工作,但它仍然依赖于网络连接来下载包和依赖项。通过创建docker容器,我已经克服了这一点。我将用我的应用程序和所有依赖项构建一个容器,创建一个新的docker映像并将docker映像提供给客户。唯一的依赖就是系统上有docker,运行我的应用程序的方法是使用docker run。在
另一种打包所有依赖项的方法是使用http://www.pyinstaller.org/,它创建一个独立的应用程序来打包所有依赖的模块。免责声明:我还没有在任何大型应用程序上使用它,刚刚开始测试它,到目前为止还适用于较小的程序。在
希望这有帮助!在
我并不认为这是完美的,但下面是我在实践中发现的非常强大的脚本:一个}在任何情况下都能成功(即使是对于全新的服务器),而不管您使用的是什么操作系统。(我真希望与操作系统无关的安装是行业标准的,至少在macosx和每个Linux发行版上是这样…)
install.sh
脚本,它最初是为一个名为words2map的人工智能库派生的。目标是确保用户可以简单地运行./install.sh
,然后所有需要的pip install this
和{请直接跳到代码,但是对于那些需要解释的人:这个},这似乎覆盖了大多数终端(但可能不需要添加)。有很多好处,但实际上这提供了一个非常好的UX,可以帮助用户立即启动并运行您正在分发的一个新的复杂Python库,因为您可以通过尝试立即下载并运行words2map为自己进行测试。如果对每个人都有意义/使其更好/更清晰,则强烈鼓励对此进行编辑。好了,开始节目吧!在
install.sh
脚本很大程度上依赖于Conda包分发管理器,考虑到它自动构建特定于操作系统的轮子,它工作得非常好。下面的安装代码首先检查用户的操作系统,然后安装适当的Conda发行版(如果在macosx和Linux上,在本例中),然后根据需要通过Conda安装所有剩余的依赖项。另外,请注意,如果检测到一个Linux终端,它首先确保所需的编译库可以通过sudo apt-get install python-dev
等方式获得(因为用户经常丢失gcc
或其他东西),最后这会自动将Conda添加到用户的路径中,bash
和{legel建议的问题在于,最终还是要依赖用户的环境来部署应用程序。在
在过去,我有类似的安装脚本,这些脚本会完成部署应用程序的所有繁琐工作,但它仍然依赖于网络连接来下载包和依赖项。通过创建docker容器,我已经克服了这一点。我将用我的应用程序和所有依赖项构建一个容器,创建一个新的docker映像并将docker映像提供给客户。唯一的依赖就是系统上有docker,运行我的应用程序的方法是使用docker run。在
另一种打包所有依赖项的方法是使用http://www.pyinstaller.org/,它创建一个独立的应用程序来打包所有依赖的模块。免责声明:我还没有在任何大型应用程序上使用它,刚刚开始测试它,到目前为止还适用于较小的程序。在
希望这有帮助!在
相关问题 更多 >
编程相关推荐