【问题标题】:How to get Django 1.7 working on Ubuntu 14.04 with nginx and virtualenv using python 2.7 while having python 3.4 installed?如何在安装了 python 3.4 的同时使用 python 2.7 让 Django 1.7 在 Ubuntu 14.04 和 nginx 和 virtualenv 上工作?
【发布时间】:2015-04-01 00:11:55
【问题描述】:

我是 Django 和 Python 安装的新手。 Ubuntu 14.04 中级。

这些是我目前在 Ubuntu 14.04 中的安装。

apt-get install python3-setuptools --force-yes -y ## for python3
easy_install3 pip ## for python3
apt-get install python-setuptools --force-yes -y ## for python2.7 or above
easy_install pip ## for python2.7 or above
apt-get install python-dev --force-yes -y ## because ubuntu 14.04 does not have dev version of python 2
apt-get install python3-dev --force-yes -y ## because ubuntu 14.04 does not have dev version of python 3.4
apt-get install links --force-yes -y ##a command line web browser
apt-get install python-flup --force-yes -y ## connects python to uwsgi)

apt-get install build-essential --force-yes -y ## 

pip2 install django uwsgi virtualenv ## use pip to install django and uwsgi and virtualenv for python2
pip3 install django uwsgi  ## use pip to install django and uwsgi for python3

完整名单请看https://gist.github.com/simkimsia/41c55e0c08eda42e2cb3#file-install-sh-L88

我对@9​​87654323@的使用感到困惑。

我想尽可能为 Django 1.7 的生产级别准备我的 ubuntu 14.04 服务器版本。

我安装多个 Python 环境的原因是因为我可能正在运行其他需要 3.4 的 Python 应用程序。

我的 Django 文件来自 bitbucket 存储库,我已将它们克隆到 /var/virtual/WebApps/DjangoProject

/var/virtual/WebApps/DjangoProject里面,我有manage.py等文件和文件夹。

请告知我如何让 Django 项目在这种情况下运行。

我目前正在我的 virtualbox 和 vagrant 上测试此设置。

编辑

至少有 2 个 Django 应用程序。 1 需要 2.7 python。另一个需要3.4 python。

让我补充一点,这是一个单独的服务器,将托管应用程序、前端和数据库。

编辑 1

我重新安装了 Ubuntu 14.04,并开始使用 Python 2.7.6 和 Python 3.4.0。

然后我做了sudo apt-get install python-virtualenv,我检查了它的版本:1.11.4

我创建了~/virtualenvs/py2.7~/virtualenvs/py3.4

~/virtualenvs 里面,我做了virtualenv -p /usr/bin/python2 py2.7~/virtualenvs,我做了virtualenv -p /usr/bin/python3 py3.4

那么如何为 python 2 应用程序安装仅 python2 的库?

例如分别是django-adminfilessorl-thumbnailpsycopg2

编辑 5

改用virtualenv --system-site-packages -p /usr/bin/python2 py2.7

【问题讨论】:

    标签: django ubuntu nginx virtualenv uwsgi


    【解决方案1】:

    我重新安装了 Ubuntu 14.04 并开始了 使用 Python 2.7.6 和 Python 3.4.0。

    好的,现在您的系统中有两个基本版本的 Python。基本版本仅表示您的操作系统支持的版本;您已全局安装。

    换句话说,您已经使用操作系统的软件包安装程序安装了它们并且没有单独编译它们

    在实践中,上述内容仅在 Linux 中很重要,因为在 Windows 中,您无法在“本地”安装而不经过几个环节;所有 Python 安装程序都会在注册表中注册自己,从而使它们成为全局的基础 Python 版本。

    然后我做了 sudo apt-get install python-virtualenv 我检查了它 版本:1.11.4。

    这个包已经过时了(当前版本是12.0.7)。

    现在您已经针对 base Python 2 版本安装了虚拟环境,因为package requires Python 2

    实际上,这意味着如果您需要升级 Python 2,您必须确保 python-virtualenv 也针对您的操作系统支持的两个 Python 的基本版本进行了更新。这意味着,当您apt-get updateapt-get upgrade 时,virtualenv 将被升级。

    通常这无关紧要,因为如果 python2 已升级,然后 python-virtualenv 未升级以匹配其依赖项,则这种情况很少见。

    但不建议这样做,因为您想“手动”控制关键软件的版本以避免任何意外。 pinning versions 有办法在 Ubuntu 和其他类似 debian 的发行版上控制它;但即使您这样做,您也可能无法获得最新版本的库,这可能会迫使您稍后卸载操作系统附带的版本,然后从源代码重新安装。 p>

    我已经创建了 ~/virtualenvs/py2.7 和 ~/virtualenvs/py3.4。

    在 ~/virtualenvs 里面,我做了 virtualenv -p /usr/bin/python2 py2.7 和 ~/virtualenvs,我做了 virtualenv -p /usr/bin/python3 py3.4

    那么如何为 python 2 应用程序安装仅 python2 的库?

    例如是 django-adminfiles、sorl-thumbnail、psycopg2

    为了正确安装solr-thumbnailpsycopg2,您需要构建它们的依赖关系;所以

    sudo apt-get install libjpeg62 libjpeg62-dev zlib1g-dev 
    sudo apt-get install libgraphicsmagick++-dev libboost-python1.55-dev
    sudo apt-get install libexpat1-dev libpython-dev libpython3-dev libssl-dev libpq-dev
    

    为 Python 2 应用安装库:

    1. 激活虚拟环境;通过输入source ~/virtualenvs/py2.7/bin/activate

    2. 键入pip install _____(库名称)


    支持多个不同主要版本的 Python 应用程序;您的系统应该安装了两个 Python 主要版本(您已经这样做了)。

    然后为每个 Python 主要版本安装 virtualenv。如果您的应用程序完全包含(也就是说,它们包含所需的 Python 运行时 - 但这种情况很少见)或者如果您有一个单一用途的服务器,您可以跳过此步骤。

    您应该避免在系统的全局 python 中安装除基本 Python 库之外的任何东西。那就是避免(以 root 身份或使用 sudo)pip install 的事情;因为这些将为所有 Python 用户安装,并且可能会导致问题(在某些系统上;例如 Fedora/RedHat - 像 yum 这样的关键系统包依赖于基础系统 Python)。

    下一步是确保您有合适的构建环境可用。这意味着来自 Debian 的系统要安装 build-essential 并进一步支持常见 Python 驱动程序和模块的库。您需要安装的确切库取决于您计划托管的应用程序,但至少应确保可以安装PIL(或Pillow)并且数据库驱动程序的支持库可用。为此,您可以apt-get build-deb python-imaging psycopg2 python-mysqldb(适用于 PostgreSQL、MySQL 和 PIL)。

    现在您的系统已准备好支持大多数 Python 应用程序。然后,您可以选择添加其他实用程序,但我会尽量避免过多地假设应用程序需要什么。

    托管应用程序:

    1. 使用所需的基本 Python 版本创建虚拟环境。所以 virtualenv-2.7 或 virtualenv-3 作为普通的非 root 用户帐户。

    2. 将所需的包安装到虚拟环境中。

    3. 调整应用程序的引导脚本以使用正确的 Python 二进制文件。这通常是从您用来管理应用程序服务器的任何进程中完成的。例如,在我的服务器上,我使用supervisord

    这就是你所要做的。其他一切都取决于各个应用程序的要求和设置(因此,如果您需要提供静态文件,则必须配置该映射等)


    阅读您的shell script 后,您似乎正在尝试构建一个支持应用程序、前端和数据库的服务器。

    为了支持这样的系统;您将需要安装以下内容:

    1. 您希望支持的数据库服务器。由于这是一个单一用途的服务器,您还需要安装数据库命令行客户端。

    2. 源码工具(git等)

    3. 全局进程管理器(如supervisorcircus)。

    4. 您打算支持的基础 Python 版本;及其开发标头 (sudo apt-get install python-dev)

    5. setuptoolspip,然后是virtualenv。这些工具应该从源代码安装,而不是你的包管理器;以确保安装了最新版本。您应该全局安装这些(即,以 root 身份),以便所有用户都可以使用它们。

    6. 构建工具链(即“开发工具”或build-essential

    7. 支持任何扩展的库(但不包括扩展本身)。最简单的方法是使用包管理器来构建依赖项,而不是包sudo apt-get build-dep python-imaging psycopg2 python-mysqldb

    接下来您需要决定如何运行您的应用程序服务器(“django 代码”)。您可以使用 uwsgigunicorn 等,因为这些是 django 测试最多的。

    您需要能够支持这些运行时的多个版本,而不是在整个系统中全局安装它们;只需构建它们的依赖项并在其自己的隔离环境中安装每个应用程序所需的特定版本。

    接下来您需要安装应用程序的前端代理。您可以安装任何适合您需要的代理(nginx 是最受欢迎的);但请从源代码安装而不是软件包,因为它们几乎总是过时的。

    所有这些设置完成后,托管 django 应用程序的过程如下:

    1. 使用非登录 shell 创建单独的用户帐户。
    2. 在该用户的主目录中创建一个虚拟环境。我建议在此处保留一些标准,例如用于虚拟环境的 env
    3. 下载/复制应用程序的源代码。
    4. 创建一个标准目录,您将在其中存储静态文件。例如我使用$HOME/www/static
    5. 在您的流程管理器中创建一个条目。
    6. 在您的代理中为前端路由创建一个条目。
    7. 重新加载您的代理服务器。
    8. 重新加载您的流程管理器。

    您可以自动化/编写上述很多内容。例如,您可以创建custom skeleton directory,以便在添加新用户时为您创建基本目录;并且您可以使用cookiecutter 等工具为其他区域创建自定义模板。

    【讨论】:

    • "除了基本的 Python 库之外,您应该避免安装任何东西" 我使用 root 并且我使用 pip2 和 pip3 代替。这算回避吗?
    • " 您至少应该确保可以安装 PIL(或 Pillow)并且数据库驱动程序的支持库可用。为此,您可以 apt-get build-deb python-imaging psycopg2 python -mysqldb(用于 PostgreSQL、MySQL 和 PIL)。”我使用 pip2 install psycopg2 而对于 postgres 和 mysql,我这样做了 gist.github.com/simkimsia/… 可以吗?
    • "创建一个需要基本版本 Python 的虚拟环境。因此 virtualenv-2.7 或 virtualenv-3 作为普通的非 root 用户帐户。"你能用确切的命令行详细说明吗?到目前为止,我使用 root 用户帐户运行 pip2 install virtualenv。我需要撤消此操作吗?
    • 1.不,但是您需要全局安装一些软件包。 pipvirtualenv 是您需要全局安装的软件包示例(即,使用 sudo 或以 root 身份安装)。您应该避免全局安装django,因为某些应用程序可能需要不同的版本。 2. 不,那不行——你已经全局安装了 python 驱动程序(我怀疑它是否正确安装,因为你可能缺少依赖项)。 3.没有;没关系。只需以普通用户身份运行 virtualenv 即可为您托管的 Python 应用程序创建环境。
    • 从问题 1 开始,我已经没有避免正确安装基础 Python 库。我应该从头开始吗?我不介意,因为这只是一个虚拟机,我真的想确保在我投入生产之前我能做到这一点。
    【解决方案2】:

    了解执行路径

    要理解的第一个原则是,当您使用sudo 在您的操作系统(虚拟机等)上安装软件包时,您将所有这些软件包安装在一个全局位置,即您的系统所在的文件目录通过$PATH (PATH) 环境变量了解。

    这个$PATH 变量通常默认设置在您的.bashrc.bash_profile.profile 中,每当创建新的linux/unix 用户时。您是否拥有这些文件取决于系统上/etc/skel 中的内容。 /etc/skel 拥有这些文件的“模板”,每当创建具有主目录的新用户时,该模板就会被复制。

    当你在命令行输入echo $PATH时,你会看到一个以:分隔的执行搜索路径列表,例如:

    /usr/local/sbin:/usr/local/bin:/usr/bin

    这是我将用于本次讨论的示例。不同的操作系统会给你略微不同的默认 $PATH 但这里的简单想法是你的全局安装包的二进制文件被扔到这些目录之一中,你能够运行这些二进制文件的原因是因为这些二进制文件(程序)是现在在执行搜索路径中可用(简称为$PATH)。

    好的,但这对我安装的 python 2 和 python 3 解释器意味着什么?

    因此,就您的问题而言,这意味着当您 sudo apt-getsudo aptitude 安装 python2 或 python3 二进制文件(python 解释器)时,它们都是可用的,并且可以随时区分您使用的解释器,您会运行python2.7python3.4 对应地调用/usr/bin/python2.7/usr/bin/python3.4

    您始终可以使用which linux/unix 命令轻松检查这一点。 which python3.4 将返回您安装 python3.4 二进制文件的确切路径。

    同样,当在命令行中输入 pip2.7 时,您会要求系统执行与 python2.7 软件包一起安装的 pip2.7 程序。当然which pip2.7 会告诉你这个pip2.7 二进制文件的安装位置。

    所有这一切都是可能的,因为这些二进制文件是您使用sudo apt-get 安装的,并且放置在$PATH 中列出的目录中。如果您将其中一个二进制文件强行移动到$PATH 中未列出的另一个目录,您将意识到如果不输入二进制文件的特定路径,您将无法再在命令行中运行该二进制文件。

    其他 python 特定信息

    Python 解释器有另一个属性调用$PYTHONPATH。这 - 正如您将正确推断的那样 - 是一个变量,它包含一个目录列表(“搜索路径”),python 解释器将在其中搜索要加载的 python 模块。如果你想知道你的 python 解释器当前在哪里寻找模块(你自己的 python 模块或 3rd 方 python 模块),运行

    python -c "import sys; print(sys.path)"

    python 是您特定的 Python 解释器。如果/usr/bin/python 符号链接到/usr/bin/python2.7,那么您实际上是在调用python2.7

    python 路径何时重要?当您询问import 其他模块时,这在您自己的.py 源代码中很重要。 .py 源代码中的 import 代码行是您要求 python 解释器继续搜索您要导入的模块的地方。可以想象,如果您的sys.path(在 python 中)为空,您将无法导入任何第 3 方模块。

    超越血腥细节

    既然我们清楚地了解了$PATH$PYTHONPATH 背后的基本原理,我们现在可以了解virtualenv(此外,virtualenvwrapper 很有用)对我们的作用。

    当我们创建一个新的 virtualenv 给它一个目录时,我们的意思是我们想要将一个特定的 python 解释器(通过 virtualenv 命令的-p python2.7 标志)符号链接到那个 virtualenv。

    当我们激活我们创建的 virtualenv 时,我们实际上是在调用 virtualenv 附带的 shell 脚本来动态修改 $PATH。尝试在源激活您创建的 virtualenv 后运行echo $PATH。你看到了什么?

    没错,你会看到这样的:-

    /Users/calvin/.virtualenvs/myproject/bin:/usr/local/sbin:/usr/local/bin:/usr/bin

    如果你输入which python,你会得到什么?

    /Users/calvin/.virtualenvs/myproject/bin/python

    没错,我们使用的python解释器是在virtualenv目录中的,不再来自/usr/bin目录。

    如果你跑了

    ls -la /Users/calvin/.virtualenvs/myproject/bin

    你看到了什么?

    啊!创建此 virtualenv 时指定的特定全局 python 解释器的符号链接。如果您没有看到符号链接,这意味着您的整个 Python 解释器是从全局安装的解释器中复制过来的。

    这就是我们的 virtualenv 工具所做的。它让我们可以隔离特定项目并选择用于特定项目的 Python 解释器。

    一旦你激活了一个 virtualenv 的源,你的 pip 也是位于你的 virtualenv 目录中的 pip。这个 pip 是 python 路径感知的。当您发出pip install 命令时,python 包现在会安装到您的

    /Users/calvin/.virtualenvs/myproject/lib/site-packages

    python 包目录;并且在您源激活特定项目时可用于您的项目。

    如果您使用sudo pip 安装软件包会怎样?

    sudo pip 调用全局安装的 python 解释器附带的 pip 工具。当你使用sudo pip 时,你正在将你的 python 包安装到一个全局位置(它不在 virtualenv 中)。

    对于你的 how-can-I-make-two-projects-use-two-different-python-interpreters 问题,我没有给你具体的答案。我解释了这些原则,现在你知道了这些原则,你需要做什么就很清楚了。干杯!

    :D

    【讨论】:

      【解决方案3】:

      您应该尝试以下步骤以使您的 django 与 python-2.7 一起工作。

      由于 Ubuntu-14 已经安装了 Python-2.7。所以不需要安装python-2.7。 首先为python-2.7安装python setuptools:

      https://pypi.python.org/packages/source/s/setuptools/setuptools-12.0.5.tar.gz
      tar -zxvf setuptools-12.0.5.tar.gz
      cd setuptools-12.0.5/
      sudo python2.7 setup.py install
      

      安装 setuptools 后为 python-2.7 安装 pip

      wget https://pypi.python.org/packages/source/p/pip/pip-6.0.8.tar.gz
      tar -zxvf pip-6.0.8.tar.gz
      cd pip-6.0.8/
      sudu python2.7 setup.py install
      

      安装 pip 后,现在我们必须去安装 python 虚拟环境:

      sudo pip2.7 install virtualenv 
      

      然后到要使用 python 2.7 创建新 virtualenv 的文件夹 virtualenv-2.7 “新虚拟环境的名称,例如 '/var/virtual/DjangoProject'” cd /var/virtual/

      virtualenv-2.7 DjangoProject
      

      注意刚刚创建的 virtualenv 名称是“DjangoProject” 现在是时候激活新的 virtualenv 了

      cd DjangoProject
      source bib/activate
      

      现在是时候在此处克隆您的项目了。

      git clone "your git url"
      

      在此处安装其余应用程序和 django。如果您已创建只需按require.txt 安装

      cd "projectFolder"
      pip install -r requirement.txt
      

      完成所有这些之后,你的新 python2.7 django 和 virtualenv 就可以使用了。只需运行 django wsgi 服务器进行测试即可:

      python manage.py runserver.
      

      现在您可以使用此 virtualenv 和项目来设置 Web 服务器。

      希望这对您有所帮助。

      【讨论】:

        【解决方案4】:

        您应该使用pyenv(和pyenv virtualenvwrapper)。使用这些工具,您可以拥有多个 Python 版本并在它们之间切换。

        以下是如何设置一个使用 Python 3.4.2 的环境和一个使用 Python 2.7.8 的环境(每个环境都可以有自己的 Python 包)

        # install pyenv
        git clone https://github.com/yyuu/pyenv.git ~/.pyenv
        
        # setup pyenv and load when shell is loaded
        echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
        echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
        echo 'eval "$(pyenv init -)"' >> ~/.bashrc
        
        # install pyenv virtualenvwrapper
        git clone https://github.com/yyuu/pyenv-virtualenvwrapper.git ~/.pyenv/plugins/pyenv-virtualenvwrapper
        
        # setup pyenv virtualenvwrapper and load when shell is loaded
        echo 'export PYENV_VIRTUALENVWRAPPER_PREFER_PYVENV="true"' >> ~/.bashrc
        echo "pyenv virtualenvwrapper" >> ~/.bashrc
        

        现在一切都设置好了。重新启动你的 shell。

        # install python 2.7.8
        pyenv install 2.7.8
        pyenv rehash
        
        # install python 3.4.2
        pyenv install 3.4.2
        pyenv rehash
        
        # switch the global python version to 2.7.8
        pyenv global 2.7.8
        
        # create a virtual environment using python 2.7.8
        mkvirtualenv project278
        
        # -- now you can install you python 2 modules
        
        # leave the virtual environment
        deactivate
        
        
        # switch the global python to 3.4.2
        pyenv global 3.4.2
        
        # create a virtual environment using python 3.4.2
        mkvirtualenv project342
        
        # -- now you can install you python 2 modules
        
        # leave the virtual environment
        deactivate
        
        # switch the global python to the system python.
        pyenv global system
        
        # swith to environment project278 and check the python version
        workon project278
        python --version
        
        # swith to environment project342 and check the python version
        workon project342
        python --version
        

        瞧!您现在有两个具有不同 Python 版本的环境。只需使用workon(和deactivate)命令在它们之间切换。

        请务必阅读使用过的软件包的文档,以便了解发生了什么!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-02-06
          • 2016-06-26
          • 2016-05-22
          • 2015-06-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-28
          相关资源
          最近更新 更多