أرشيف لـأبريل, 2013

كيف تستخدم virtualenv

Posted: أبريل 26, 2013 in General
الوسوم:,

 

لتجربة أفضل في القراءة فضلا تابع الموضوع هنا

http://arabteam2000-forum.com/index.php/topic/277534-%D9%83%D9%8A%D9%81-%D8%AA%D9%86%D8%B4%D8%A6-%D8%A8%D9%8A%D8%A6%D8%A7%D8%AA-%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-%D9%85%D8%B9%D8%B2%D9%88%D9%84%D8%A9-%D9%84%D9%85%D8%B4%D8%B1%D9%88%D8%B9%D9%83-%D8%B9%D8%A8%D8%B1-virtualenv/

 

كتبت مشروع ب Django 1.0 وسارت الأمور جيدا ولكن أحببت أن تكتب مشروع آخر ب Django 1.5 ويوجد تغييرات كثيرة ، فقد تقوم بعمل عدة أشياء تعتمد على إصدارات مختلفة من نفس الحزمة وهنا تحدث المشكلة. كيف يمكن تنصيب Django 1.0 و Django 1.5 في نفس الوقت ؟
أو حتى غير متاح لك عبر الصلاحيات إضافة حزم على مستوى النظام ؟

system-wide installation
المقصود بها هو التنصيب لتصبح مع المكتبات المعلومة على مستوى النظام ، ستجدها على سبيل المثال في مسار مثل
/usr/lib64/python/site-packages
وهذا مايتم فعله عندما تستخدم easy_install او pip

كالعادة يوجد لدينا حل ذكي وهو virtualenv وهي آداة تقوم بإنشاء بيئات مستقلة قائمة بذاتها لبايثون

أذهب الآن إلى سطر الأوامر وقم بتنفيذ

easy_install virtualenv
easy_install pip

الآن بعض العمل

<br />[striky@localhost mywspace]$ virtualenv sniply<br />New python executable in sniply/bin/python<br />Installing setuptools............done.<br />Installing pip...............done.<br />[striky@localhost mywspace]$ cd sn<br />snapboard-read-only/ sniply/ <br />[striky@localhost mywspace]$ cd sniply/</p><p>

قمنا بإنشاء بيئة عمل جديدة بإسم sniply -المفترض إسم مشروع مشابه ل gist ويقوم بتصغير الرابط كذلك- عبر الأمر virtualenv
لاحظ وجود setuptools إفتراضيا إذا أردت أن تستخدم distribute فقم بتمرير معامل –distribute للأمر virtualenv او قم بتعريف متغير
$export VIRTUALENV_DISTRIBUTE=true

فلنظر لهيكلية البيئة التي تم إنشائها

<br />[striky@localhost sniply]$ tree .<br />.<br />├── bin<br />│   ├── activate<br />│   ├── activate.csh<br />│   ├── activate.fish<br />│   ├── activate_this.py<br />│   ├── easy_install<br />│   ├── easy_install-2.7<br />│   ├── pip<br />│   ├── pip-2.7<br />│   └── python<br />├── include<br />│   └── python2.7 -&gt; /usr/include/python2.7<br />├── lib<br />│   └── python2.7<br />│   ├── _abcoll.py -&gt; /usr/lib64/python2.7/_abcoll.py<br />│   ├── _abcoll.pyc<br />│   ├── abc.py -&gt; /usr/lib64/python2.7/abc.py<br />│   ├── abc.pyc<br />│   ├── codecs.py -&gt; /usr/lib64/python2.7/codecs.py<br />│   ├── codecs.pyc<br />│   ├── config -&gt; /usr/lib64/python2.7/config<br />│   ├── copy_reg.py -&gt; /usr/lib64/python2.7/copy_reg.py<br />│   ├── copy_reg.pyc<br />│   ├── distutils<br />│   │   ├── distutils.cfg<br />│   │   ├── __init__.py<br />│   │   └── __init__.pyc<br />│   ├── encodings -&gt; /usr/lib64/python2.7/encodings<br />│   ├── fnmatch.py -&gt; /usr/lib64/python2.7/fnmatch.py<br />│   ├── fnmatch.pyc<br />│   ├── genericpath.py -&gt; /usr/lib64/python2.7/genericpath.py<br />│   ├── genericpath.pyc<br />│   ├── lib-dynload -&gt; /usr/lib64/python2.7/lib-dynload<br />│   ├── linecache.py -&gt; /usr/lib64/python2.7/linecache.py<br />│   ├── linecache.pyc<br />│   ├── locale.py -&gt; /usr/lib64/python2.7/locale.py<br />│   ├── no-global-site-packages.txt<br />│   ├── ntpath.py -&gt; /usr/lib64/python2.7/ntpath.py<br />│   ├── orig-prefix.txt<br />│   ├── os.py -&gt; /usr/lib64/python2.7/os.py<br />│   ├── os.pyc<br />│   ├── posixpath.py -&gt; /usr/lib64/python2.7/posixpath.py<br />│   ├── posixpath.pyc<br />│   ├── re.py -&gt; /usr/lib64/python2.7/re.py<br />│   ├── re.pyc<br />│   ├── site-packages<br />│   │   ├── easy-install.pth<br />│   │   ├── pip-1.2.1-py2.7.egg<br />│   │   │   ├── EGG-INFO<br />│   │   │   │   ├── dependency_links.txt<br />│   │   │   │   ├── entry_points.txt<br />│   │   │   │   ├── not-zip-safe<br />│   │   │   │   ├── PKG-INFO<br />│   │   │   │   ├── SOURCES.txt<br />│   │   │   │   └── top_level.txt<br />│   │   │   └── pip<br />│   │   │   ├── backwardcompat.py<br />│   │   │   ├── backwardcompat.pyc<br />│   │   │   ├── basecommand.py<br />│   │   │   ├── basecommand.pyc<br />│   │   │   ├── baseparser.py<br />│   │   │   ├── baseparser.pyc<br />│   │   │   ├── commands<br />│   │   │   │   ├── bundle.py<br />│   │   │   │   ├── bundle.pyc<br />│   │   │   │   ├── completion.py<br />│   │   │   │   ├── completion.pyc<br />│   │   │   │   ├── freeze.py<br />│   │   │   │   ├── freeze.pyc<br />│   │   │   │   ├── help.py<br />│   │   │   │   ├── help.pyc<br />│   │   │   │   ├── __init__.py<br />│   │   │   │   ├── __init__.pyc<br />│   │   │   │   ├── install.py<br />│   │   │   │   ├── install.pyc<br />│   │   │   │   ├── search.py<br />│   │   │   │   ├── search.pyc<br />│   │   │   │   ├── uninstall.py<br />│   │   │   │   ├── uninstall.pyc<br />│   │   │   │   ├── unzip.py<br />│   │   │   │   ├── unzip.pyc<br />│   │   │   │   ├── zip.py<br />│   │   │   │   └── zip.pyc<br />│   │   │   ├── download.py<br />│   │   │   ├── download.pyc<br />│   │   │   ├── exceptions.py<br />│   │   │   ├── exceptions.pyc<br />│   │   │   ├── index.py<br />│   │   │   ├── index.pyc<br />│   │   │   ├── __init__.py<br />│   │   │   ├── __init__.pyc<br />│   │   │   ├── locations.py<br />│   │   │   ├── locations.pyc<br />│   │   │   ├── log.py<br />│   │   │   ├── log.pyc<br />│   │   │   ├── __main__.py<br />│   │   │   ├── __main__.pyc<br />│   │   │   ├── req.py<br />│   │   │   ├── req.pyc<br />│   │   │   ├── runner.py<br />│   │   │   ├── runner.pyc<br />│   │   │   ├── status_codes.py<br />│   │   │   ├── status_codes.pyc<br />│   │   │   ├── util.py<br />│   │   │   ├── util.pyc<br />│   │   │   └── vcs<br />│   │   │   ├── bazaar.py<br />│   │   │   ├── bazaar.pyc<br />│   │   │   ├── git.py<br />│   │   │   ├── git.pyc<br />│   │   │   ├── __init__.py<br />│   │   │   ├── __init__.pyc<br />│   │   │   ├── mercurial.py<br />│   │   │   ├── mercurial.pyc<br />│   │   │   ├── subversion.py<br />│   │   │   └── subversion.pyc<br />│   │   ├── setuptools-0.6c11-py2.7.egg<br />│   │   └── setuptools.pth<br />│   ├── site.py<br />│   ├── site.pyc<br />│   ├── sre_compile.py -&gt; /usr/lib64/python2.7/sre_compile.py<br />│   ├── sre_compile.pyc<br />│   ├── sre_constants.py -&gt; /usr/lib64/python2.7/sre_constants.py<br />│   ├── sre_constants.pyc<br />│   ├── sre_parse.py -&gt; /usr/lib64/python2.7/sre_parse.py<br />│   ├── sre_parse.pyc<br />│   ├── sre.py -&gt; /usr/lib64/python2.7/sre.py<br />│   ├── stat.py -&gt; /usr/lib64/python2.7/stat.py<br />│   ├── stat.pyc<br />│   ├── types.py -&gt; /usr/lib64/python2.7/types.py<br />│   ├── types.pyc<br />│   ├── UserDict.py -&gt; /usr/lib64/python2.7/UserDict.py<br />│   ├── UserDict.pyc<br />│   ├── warnings.py -&gt; /usr/lib64/python2.7/warnings.py<br />│   ├── warnings.pyc<br />│   ├── _weakrefset.py -&gt; /usr/lib64/python2.7/_weakrefset.py<br />│   └── _weakrefset.pyc<br />└── lib64 -&gt; ./lib</p><p>16 directories, 122 files</p><p>

الآن ماذا ؟
كما ترى في مجلد bin يوجد عدة ملفات تنفيذية مثل activate, easy_install, pip, python
فكما خمنت قم بتفعيل تلك البيئة الإفتراضية المعزولة عبر activate

<br />[striky@localhost sniply]$ source bin/activate<br />(sniply)[striky@localhost sniply]$</p><p>

لاحظ هنا وجود كلمة (sinply) اما مؤشر المستخدم لتشير إلى أنك داخل البيئة الإفتراضية sniply

للخرو ج من بيئة sniply بكل بساطة إستدعي الأمر deactivate

<br />(sniply)[striky@localhost sniply]$ deactivate <br />[striky@localhost sniply]$</p><p>

قم بتنصيب ماتشاء

<br />(sniply)[striky@localhost sniply]$ pip install flask<br />

مثلا سأقوم بتنصيب flask لكون النسخة التي تم تنصيبها على النظام قديمة قليلا

الناتج

<br />(sniply)[striky@localhost sniply]$ ls lib64/python2.7/site-packages/<br />easy-install.pth pip-1.2.1-py2.7.egg<br />flask setuptools-0.6c11-py2.7.egg<br />Flask-0.9-py2.7.egg-info setuptools.pth<br />jinja2 werkzeug<br />Jinja2-2.6-py2.7.egg-info Werkzeug-0.8.3-py2.7.egg-info</p><p>

لاحظ أن تم تنصيب flask و الحزم المتعلقة بها على مستوى بيئة sniply وليست على مستوى النظام
لنا لقاء آخر عن virtualenvwrapper

http://www.virtualenv.org/en/latest/