2016-07-05 2 views

답변

4

내가이 완벽 주장하지 않습니다 ... 많은 그런 패키지가 위에서 언급 한 것을 포함 pip의 주요 채널을 통해 다소 쉽게 설치되어 있는지,하지만 다음 나는 무엇이다 실제로 강력한 것으로 밝혀졌습니다 : 스크립트는 원래 words2map이라는 인공 지능 라이브러리 용으로 여기에서 파생되었습니다. 목표는 사용자가 ./install.sh을 간단히 실행할 수있게하고 운영 체제에 관계없이 모든 경우에 (모든 새로운 서버의 경우에도) 모든 필요한 경우 pip install thispip install that이 성공할 수 있도록하는 것이 었습니다. (나는 OS 독립적 인 설치가 최소한 Mac OSX와 모든 Linux 배포판에서 업계 표준 이었으면 좋겠다 ...)

코드를 직접 건너 뛰어도되지만 설명을 요구하는 사람들은 자유롭게이 install.sh 스크립트에 많이 의존한다. Conda 패키지 배포 관리자에서 정말 멋지게 작동합니다. OS 별 바퀴가 자동으로 만들어지기 때문입니다. 아래의 설치 코드는 먼저 사용자의 OS를 확인한 다음 Conda 배포판 (이 경우 Mac OSX 및 Linux의 경우)을 설치 한 다음 Conda를 통해 필요한 나머지 종속성을 모두 설치합니다. 또한, 리눅스 터미널이 발견되면 먼저 필요한 컴파일 라이브러리가 예를 들어, sudo apt-get install python-dev (종종 사용자에게 gcc 또는 그 밖의 것이 누락되어 있기 때문에) 마지막으로 Conda를 사용자의 PATH에 자동으로 추가하여 bashzshell을 처리합니다. 대부분의 터미널을 커버하는 것으로 보이지만 (어쩌면 추가 할 필요는 없습니다.) 많은 종소리와 휘파람이 있지만 실제로는 words2map을 즉시 다운로드하고 실행하여 사용자가 직접 테스트 할 수 있도록 배포중인 새로운 복잡한 Python 라이브러리를 사용하여 즉시 시작하고 실행할 수있는 유용한 UX를 제공합니다. 이 편집은 모든 사람들에게 더 좋거나 더 선명하게 만들면 강력하게 권장됩니다. 좋아, 쇼에!

#!/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 
0

legel의 제안에 대한 문제점은 응용 프로그램을 배포하기 위해 여전히 사용자의 환경에 의존한다는 것입니다.

과거에는 응용 프로그램을 배포하기 위해 모든 더러운 작업을 수행하는 유사한 설치 스크립트를 사용했지만 네트워크 연결을 통해 패키지와 종속성을 다운로드합니다. 나는 도커 컨테이너를 만들어서 그 일을 지나쳤습니다. 내 응용 프로그램과 모든 종속성을 가진 컨테이너를 만들고, 새로운 도커 이미지를 만들고, 고객에게 도커 이미지를 제공합니다. 유일한 종속성은 시스템에 도커를 두는 것입니다. 내 앱을 실행하는 방법은 도커 실행을 사용하는 것입니다.

모든 종속성을 패키지하는 다른 방법은 모든 종속 모듈을 패키징하는 독립형 응용 프로그램을 만드는 http://www.pyinstaller.org/을 사용하는 것입니다. 면책 조항 : 나는 아직 어떤 큰 응용 프로그램에도 이것을 사용하지 않았으며 방금 테스트를 시작했으며 지금까지는 더 작은 프로그램에서도 작동합니다.

희망이 도움이됩니다.

+0

의견에 감사드립니다. 나는 Docker에 대해서도 살펴 보았지만, 약간의 것들에 의해 약간은 꺼져 있었다 ... Mac 지원이 현재로서는 "공개 베타"인 것처럼 보인다. (이것은 내가 생각하기에 새로운 개발이다). 그들의 전반적인 플랫폼은 또한 매우 큰 것처럼 보입니다. "적어도 4GB의 RAM"은 Mac 튜토리얼에서 설명하는 것입니다. 즉, 1GB의 RAM을 가진 EC2 마이크로 인스턴스를 좋아하는 사람들은 즉시 차단됩니다.대조적으로 Conda는 가볍고 완전히 크로스 플랫폼입니다. 하지만 뭔가를 놓친 것일까 요? PyInstaller는 확실히 멋지게 보이고 체크 아웃할만한 가치가 있습니다. – legel