我是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
我对使用virtualenv
感到困惑。
我想尽可能准备好我的ubuntu 14.04服务器版本的生产级别Django 1.7。
之所以我安装了多个Python环境,是因为我可能有其他Python应用程序需要运行3.4。
我的Django文件来自bitbucket存储库,我有git克隆到/var/virtual/WebApps/DjangoProject
里面/var/virtual/WebApps/DjangoProject
,我有manage.py和其他文件和文件夹。
请告诉我如何获得运行这种情况下的Django项目。
我目前在我的virtualbox和stream浪汉上testing这个设置。
编辑
至less有两个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
。
我创build了~/virtualenvs/py2.7
和~/virtualenvs/py3.4
。
在~/virtualenvs
里面,我做了virtualenv -p /usr/bin/python2 py2.7
和~/virtualenvs
,我做了virtualenv -p /usr/bin/python3 py3.4
那么,如何安装python2应用程序库?
比如django-adminfiles
, sorl-thumbnail
, psycopg2
编辑5
使用virtualenv --system-site-packages -p /usr/bin/python2 py2.7
来代替
我重新启动了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
)。
现在,您已经针对基本的Python 2版本安装了虚拟环境,因为该软件包需要Python 2 。
实际上,这意味着如果您需要升级Python 2,则必须确保python-virtualenv
也针对您的操作系统支持的Pythons的基础版本进行了更新。 这意味着,当你apt-get update
和apt-get upgrade
, virtualenv
将被升级。
通常这并不重要,因为如果升级了python2
,然后python-virtualenv
没有升级到与其依赖关系相匹配的情况,这种情况很少见。
不过,建议不要这样做,因为要“手动”控制关键软件的版本以避免任何意外。 有办法通过固定版本来控制Ubuntu和其他类似Debian的发行版 ; 但即使您这样做了,也可能没有获取最新版本的库,这可能会强制您稍后卸载操作系统附带的版本,并从源代码重新安装。
我创建了〜/ virtualenvs / py2.7和〜/ virtualenvs / py3.4。
在〜/ virtualenvs里面,我做了virtualenv -p / usr / bin / python2 py2.7和〜/ virtualenvs,我做了virtualenv -p / usr / bin / python3 py3.4
那么,如何安装python2应用程序库?
比如django-adminfiles,sorl-thumbnail,psycopg2
为了正确安装solr-thumbnail
和psycopg2
,你需要建立它们的依赖; 所以
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应用程序安装库:
激活虚拟环境; 通过输入source ~/virtualenvs/py2.7/bin/activate
输入pip install _____
(库的名称)
为了支持不同主要版本的多个Python应用程序; 你的系统应该安装两个Python主版本(你已经完成了这个)。
然后,您为每个Python主版本安装virtualenv。 如果您的应用程序完全被包含(即,它们包括所需的Python运行时,但是这种情况极少),或者您拥有单个目的服务器,则可以跳过此步骤。
你应该避免在你的系统的全局python里安装基本的Python库。 这是避免(作为根,或使用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应用程序。 然后,您可以选择添加其他实用程序,但我会尽量避免假设太多的应用程序将需要。
托管一个应用程序:
使用所需的基本版本创建一个虚拟环境。 所以virtualenv-2.7或virtualenv-3作为普通的非root用户帐户。
将所需的软件包安装到虚拟环境中。
调整应用程序的引导脚本以使用正确的Python二进制文件。 这通常是通过您用来管理应用程序服务器的任何过程完成的。 例如,在我的服务器上,我使用supervisord
。
这就是你所要做的。 其他一切都将取决于个别应用程序的要求和设置(所以如果您需要提供静态文件,您将不得不配置该映射等)
看完你的shell脚本后 ,似乎你正在试图构建一个支持应用程序,前端和数据库的服务器。
为了支持这样一个系统; 您将需要安装以下内容:
您希望支持的数据库服务器。 由于这是一个单一目的服务器,您还需要安装数据库命令行客户端。
源代码工具( git
等)
全球流程经理(如supervisor
或circus
)。
您打算支持的基本Python版本; 和他们的开发头文件( sudo apt-get install python-dev
)
setuptools
, pip
,然后是virtualenv
。 这些工具应该从源代码安装,而不是你的软件包管理器。 以确保安装最新版本。 您应该全局安装(即以root身份),以便所有用户都可以使用它们。
构建工具链(即“开发工具”或build-essential
)
支持任何扩展的库(但不是扩展本身)。 最简单的方法是使用包管理器来构建依赖关系而不是包sudo apt-get build-dep python-imaging psycopg2 python-mysqldb
。
接下来你需要做的是决定你将如何运行你的应用程序服务器(“django代码”)。 你可以使用gunicorn
, gunicorn
等,因为这些是最受django测试的。
您需要能够支持这些运行时的多个版本,而不是在系统中全局安装; 只需构建它们的依赖关系,并在每个应用程序的独立环境中安装所需的特定版本即可。
接下来您需要安装的是您的应用程序的前端代理。 你可以安装任何适合你需要的代理(nginx是最流行的); 但是请从源代码安装,而不是软件包,因为那些几乎都是过时的。
一旦所有这一切都设置好,承载一个Django应用程序的过程如下:
env
。 $HOME/www/static
。 你可以自动化/脚本很多上述。 例如,您可以在添加新用户时创建自定义骨架目录以为您创建基本目录; 您可以使用诸如cookiecutter
工具为其他区域创建自定义模板。
了解执行路径
要理解的第一个原则是,当你在你的操作系统(虚拟机,无论是什么)上安装软件包的时候,你要把所有这些软件包安装在全局位置,也就是你的系统知道的文件目录通过$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-get
或者sudo aptitude
安装python2或python3二进制文件(python解释器)时,它们都是可用的,并且可以随时区分你使用的是哪一个中间文件,你可以运行python2.7
或python3.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模块或第三方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中)是空的,你将无法导入任何第三方模块。
超越血淋淋的细节
现在我们已经清楚了解$PATH
和$PYTHONPATH
背后的基本原理,现在我们可以了解到virtualenv
(以及virtualenvwrapper
是否有用)对我们所做的事情。
当我们创建一个新的virtualenv给它一个目录时,我们所说的是我们想要将特定的python解释器(通过-p python2.7
标志用于virtualenv命令)符号链接到该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,你的点也是位于你的virtualenv目录中的点。 这个点是Python路径感知。 当你发出pip install
命令时,python软件包现在被安装到你的
/Users/calvin/.virtualenvs/myproject/lib/site-packages
python软件包目录; 并且只有在您激活特定项目时才可用于您的项目。
如果你用sudo pip
安装软件包会怎么样?
sudo pip
调用全局安装的python解释器附带的pip工具。 当你使用sudo pip
,你正在将你的python软件包安装到一个全局位置(这不是在virtualenv中被监禁)。
我没有给你具体的答案,你怎么做,我做两个项目使用两个不同的python解释器的问题。 我解释了这些原则,现在你知道了原则,明确你需要做什么。 干杯!
:d
你应该尝试下面的步骤,使您的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-2.7创建新virtualenv的文件夹,例如“/ 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服务器。
希望这会对你有帮助。
你应该使用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
)命令在它们之间切换即可。
确保你阅读了使用过的软件包的文档,以便你了解正在发生的事情!