python पाइप, वर्चुअलएन्व, और पायथन के लिए वितरित करने का उचित तरीका क्या है?




virtualenv setuptools (12)

मुझे लगता है कि ग्लाइफ का अर्थ कुछ ऐसा है:

  1. एक निर्देशिका ~/.local बनाएँ, अगर यह पहले से मौजूद नहीं है।
  2. अपने ~/.bashrc , सुनिश्चित करें कि ~/.local/bin PATH पर है और वह ~/.local पर है।
  3. एक फ़ाइल ~/.pydistutils.cfg बनाएँ जिसमें शामिल है

    [install]
    prefix=~/.local
    

    यह एक मानक ConfigParser- प्रारूप फ़ाइल है।

  4. python distribute_setup.py Download और python distribute_setup.py चलाएं (कोई sudo )। यदि यह एक गैर-मौजूदा site-packages निर्देशिका के बारे में शिकायत करता है, तो इसे मैन्युअल रूप से बनाएं:

    mkdir -p ~ / .local / lib / python2.7 / साइट-पैकेज /

  5. यह सुनिश्चित करने के लिए कि यह ~/.local/bin से आ रहा है, यह आसान है

  6. रन pip install virtualenv
  7. रन pip install virtualenvwrapper
  8. फ़ोल्डर युक्त वर्चुअल एनवी बनाएं, ~/.virtualenvs कहें
  9. ~/.bashrc जोड़ें

    export WORKON_HOME
    source ~/.local/bin/virtualenvwrapper.sh
    

यही है, sudo का कोई भी उपयोग नहीं है और आपके पायथन पर्यावरण ~/.local , ओएस के पायथन से पूरी तरह से अलग है। अस्वीकरण: इस परिदृश्य में virtualenvwrapper कितना संगत है सुनिश्चित नहीं है - मैं इसे अपने सिस्टम पर परीक्षण नहीं कर सका :-)

संक्षिप्त प्रश्न

पृष्ठभूमि

SO प्रश्न 4314376 के उत्तर में , मैंने ez_setup का उपयोग करने की ez_setup ताकि आप निम्नानुसार pip और ez_setup स्थापित कर सकें:

curl -O http://peak.telecommunity.com/dist/ez_setup.py
sudo python ez_setup.py
sudo easy_install pip
sudo pip install virtualenv

मैंने मूल रूप से जेसी नोलर के ब्लॉग पोस्ट से इन निर्देशों को खींचा है तो आप मैक पर पायथन का उपयोग करना चाहते हैं? । मुझे एक स्वच्छ वैश्विक साइट-पैकेज निर्देशिका रखने का विचार पसंद है, इसलिए वहां इंस्टॉल किए जाने वाले एकमात्र अन्य पैकेज virtualenvwrapper और distribute । (मैंने हाल ही में इस पायथन सार्वजनिक सेवा घोषणा के कारण अपने टूलबॉक्स में distribute किया है। इन दो पैकेजों को स्थापित करने के लिए, मैंने उपयोग किया:

sudo pip install virtualenvwrapper
curl -O http://python-distribute.org/distribute_setup.py
sudo python distribute_setup.py

कोई और सेटअपtools और easy_install

वास्तव में उस पायथन सार्वजनिक सेवा घोषणा का पालन करने के लिए, एक ताजा पायथन इंस्टॉल पर, मैं निम्न कार्य करता हूं:

curl -O http://python-distribute.org/distribute_setup.py
sudo python distribute_setup.py
sudo easy_install pip
sudo pip install virtualenv
sudo pip install virtualenvwrapper

ग्लिफ रीब्यूक

SO प्रश्न 4314376 के मेरे उत्तर के लिए एक टिप्पणी में, SO उपयोगकर्ता ग्लाइफ ने कहा:

नहीं। कभी भी sudo python setup.py install जो कुछ भी sudo python setup.py install । एक ~ / .pydistutils.cfg लिखें जो आपकी पीआईपी स्थापना ~ / .local या कुछ में डालता है। विशेष रूप से ez_setup.py नाम की फ़ाइलों को setuptools और easy_install जैसी चीजों के नए संस्करणों को चूसना पड़ता है, जो संभावित रूप से आपके ऑपरेटिंग सिस्टम पर अन्य चीजों को तोड़ सकते हैं।

संक्षिप्त प्रश्न पर वापस

तो ग्लाइफ की प्रतिक्रिया मुझे मेरे मूल प्रश्न पर ले जाती है:


यदि आप इस उत्तर में जुड़े कई ट्यूटोरियल्स में सुझाए गए चरणों का पालन करते हैं, तो आप वॉकर और विनय के उत्तरों में कुछ जटिल "मैन्युअल" चरणों के बिना वांछित प्रभाव प्राप्त कर सकते हैं। यदि आप उबंटू पर हैं:

sudo apt-get install python-pip python-dev

पाइथन स्थापित करने के लिए होमब्री का उपयोग करके ओएस एक्स में बराबर प्राप्त किया जाता है ( here अधिक जानकारी)।

brew install python

pip स्थापित करने के साथ, आप शेष पैकेज प्राप्त करने के लिए इसका उपयोग कर सकते हैं (आप ओएस एक्स में sudo को छोड़ सकते हैं, क्योंकि आप अपनी स्थानीय पायथन स्थापना का उपयोग कर रहे हैं)।

sudo pip install virtualenvwrapper

(ये एकमात्र पैकेज हैं जिन्हें आपको वैश्विक रूप से स्थापित करने की आवश्यकता है और मुझे संदेह है कि यह ओएस से सिस्टम-स्तर के साथ संघर्ष करेगा। अगर आप सुपर-सुरक्षित होना चाहते हैं, तो आप डिस्ट्रो के संस्करणों को sudo apt-get install virtualenvwrapper )

नोट: उबंटू 14.04 में मुझे पाइप इंस्टॉल के साथ कुछ त्रुटियां मिलती हैं , इसलिए मैं pip3 install virtualenv virtualenvwrapper उपयोग करता pip3 install virtualenv virtualenvwrapper और मेरी .bashrc/.zshrc VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3 फ़ाइल में VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3 हूं।

फिर आप अपनी .bashrc फ़ाइल में संलग्न होते हैं

export WORKON_HOME
source /usr/local/bin/virtualenvwrapper.sh

और इसे स्रोत

. ~/.bashrc

यह मूल रूप से यह है। अब एकमात्र निर्णय यह है कि क्या आप सिस्टम-स्तरीय पैकेजों को शामिल करने के लिए वर्चुअलएन्व बनाना चाहते हैं

mkvirtualenv --system-site-packages foo

जहां आपके मौजूदा सिस्टम पैकेज को पुनर्स्थापित करने की आवश्यकता नहीं है, वे सिस्टम दुभाषिया के संस्करणों के साथ सिंक्रनाइज़ हैं। नोट: आप अभी भी नए पैकेज स्थापित कर सकते हैं और मौजूदा इन-टू-सिस्टम पैकेज को सुडो के बिना अपग्रेड कर सकते हैं - मैंने इसका परीक्षण किया और यह सिस्टम दुभाषिया के किसी भी व्यवधान के बिना काम करता है।

[email protected]:~$ sudo apt-get install python-pandas
[email protected]:~$ mkvirtualenv --system-site-packages s
(s)[email protected]:~$ pip install --upgrade pandas
(s)[email protected]:~$ python -c "import pandas; print(pandas.__version__)"
0.10.1
(s)[email protected]:~$ deactivate
[email protected]:~$ python -c "import pandas; print(pandas.__version__)"
0.8.0

वैकल्पिक, यदि आप पूरी तरह से अलग वातावरण चाहते हैं, है

mkvirtualenv --no-site-packages bar

या दिया गया है कि यह डिफ़ॉल्ट विकल्प है, बस

mkvirtualenv bar

नतीजा यह है कि आपके पास एक नया वर्चुअलनव है जहां आप स्वतंत्र रूप से और अपने पसंदीदा पैकेजों को चुस्त रूप से इंस्टॉल कर सकते हैं

pip install flask

  • आप पाइथन में कुछ भी इंस्टॉल किए बिना ऐसा कर सकते हैं।

  • आपको सूडो या किसी विशेषाधिकार की आवश्यकता नहीं है।

  • आपको virtualenv टैर फ़ाइल का नवीनतम संस्करण खोजने की आवश्यकता नहीं है

  • चीजों को अद्यतित रखने के लिए आपको बैश स्क्रिप्ट में संस्करण जानकारी संपादित करने की आवश्यकता नहीं है।

  • आपको curl / wget या tar स्थापित करने की आवश्यकता नहीं है, न ही pip या easy_install

निम्नलिखित को /tmp/initvenv.py सहेजें:

from __future__ import print_function

import os, sys, shutil, tempfile, subprocess, tarfile, hashlib

try:
    from urllib2 import urlopen
except ImportError:
    from urllib.request import urlopen

tmp_dir = tempfile.mkdtemp(prefix='initvenv_')
try:
    # read the latest version from PyPI
    f = urlopen("https://pypi.python.org/pypi/virtualenv/")
    # retrieve the .tar.gz file
    for line in f.read().splitlines():
        if isinstance(line, bytes):
            line = line.decode('utf-8')
        if 'tar.gz<' not in line:
            continue
        for url in line.split('"'):
            if url.startswith('http'):
                url, md5 = url.split('#')
                assert md5.startswith('md5=')
                md5 = md5[4:]
                break
        else:
            continue
        break
    else:
        print('tar.gz not found')
        sys.exit(1)
    file_name = url.rsplit('/', 1)[1]
    print(file_name)
    # url = "https://pypi.python.org/packages/source/v/virtualenv/" + file_name
    os.chdir(tmp_dir)
    with open(file_name, 'wb') as fp:
        data = urlopen(url).read()
        data_md5 = hashlib.md5(data).hexdigest()
        if md5 != data_md5:
            print('md5 not correct')
            print(md5)
            print(data_md5)
            sys.exit(1)
        fp.write(data)
    tar = tarfile.open(file_name)
    tar.extractall()
    tar.close()
    os.chdir(file_name.replace('.tar.gz', ''))
    print(subprocess.check_output([sys.executable, 'virtualenv.py'] +
                                  [sys.argv[1]]).decode('utf-8'), end='')
    if len(sys.argv) > 2:
        print(subprocess.check_output([
            os.path.join(sys.argv[1], 'bin', 'pip'), 'install', 'virtualenv'] +

            sys.argv[2:]).decode('utf-8'), end='')
except:
    raise
finally:
    shutil.rmtree(tmp_dir)  # always clean up

और इसका उपयोग करें

python_binary_to_use_in_venv /tmp/initvenv.py your_venv_name [optional packages]

उदाहरण के लिए (यदि आपको वास्तव में setuptools लिए distribute संगतता परत की setuptools )

python /tmp/initvenv.py venv distribute

कृपया ध्यान दें कि, पुरानी पायथन संस्करणों के साथ, यह आपको InsecurePlatformWarning s¹ दे सकता है।

एक बार जब आपके venv (नाम जैसे venv ) हो तो आप venv का उपयोग कर एक और venv सेट कर सकते हैं:

venv/bin/virtualenv venv2

virtualenvwrapper

मैं एक बार सेटअप के बाद virtualenvwrapper पर एक नज़र डालने की सलाह देता हूं:

% /opt/python/2.7.10/bin/python /tmp/initvenv.py venv virtualenvwrapper

और सक्रियण (आपकी लॉगिन स्क्रिप्ट से किया जा सकता है):

% source venv/bin/virtualenvwrapper.sh

आप चीजें कर सकते हैं जैसे:

% mktmpenv 
New python executable in tmp-17bdc3054a46b2b/bin/python
Installing setuptools, pip, wheel...done.
This is a temporary environment. It will be deleted when you run 'deactivate'.
(tmp-17bdc3054a46b2b)% 

¹ मुझे चेतावनी दबाने का कोई रास्ता नहीं मिला है। इसे pip और / या request में हल किया जा सकता है, लेकिन डेवलपर्स एक दूसरे के कारण के रूप में इंगित करते हैं। मुझे अक्सर, गैर-यथार्थवादी, पायथन संस्करण को अपग्रेड करने की सिफारिश मिली जो मैं नवीनतम संस्करण में उपयोग कर रहा था। मुझे यकीन है कि यह तोड़ देगा जैसे मेरा लिनक्स मिंट 17 इंस्टॉल। सौभाग्य से pip कैश पैकेज, इसलिए चेतावनी प्रति पैकेज स्थापित करने के बाद केवल एक बार किया जाता है।


उबंटू पर:

sudo apt-get install python-virtualenv

पैकेज python-pip एक निर्भरता है, इसलिए यह भी स्थापित किया जाएगा।


मैंने काम पर उपयोग करने के लिए इस प्रक्रिया को बनाया है।

cd ~
curl -s https://pypi.python.org/packages/source/p/pip/pip-1.3.1.tar.gz | tar xvz
cd pip-1.3.1
python setup.py install --user
cd ~
rm -rf pip-1.3.1

$HOME/.local/bin/pip install --user --upgrade pip distribute virtualenvwrapper

# Might want these three in your .bashrc
export PATH=$PATH:$HOME/.local/bin
export VIRTUALENVWRAPPER_VIRTUALENV_ARGS="--distribute"
source $HOME/.local/bin/virtualenvwrapper.sh

mkvirtualenv mypy
workon mypy
pip install --upgrade distribute
pip install pudb # Or whatever other nice package you might want.

सुरक्षा दिमाग के लिए मुख्य बिंदु:

  1. कर्ल एसएसएल सत्यापन करता है। wget नहीं करता है।
  2. पीपी 1.3.1 से शुरू, पीआईपी एसएसएल सत्यापन भी करता है।
  3. कम उपयोगकर्ता एक github tarball की तुलना में pypi tarball अपलोड कर सकते हैं।

Virtualenv आधिकारिक साइट पर अच्छे निर्देश हैं। https://pypi.python.org/pypi/virtualenv

असल में मैंने जो किया, वह virtualenv my_env sudo easy_install pip pip साथ स्थापित pip , फिर virtualenv my_env sudo pip install virtualenv virtualenv my_env उपयोग किया गया, फिर virtualenv my_env (जिसे आप चाहते हैं उसे नाम दें), उसके बाद मैंने किया: virtualenv --distribute my_env ; जो मेरे वर्चुअलएनवी में distribute और pip स्थापित किया।

फिर, virtualenv पेज पर निर्देश का पालन करें।

रुबी से आने वाली परेशानी का प्रकार; पी


आप पाइथन में कुछ भी इंस्टॉल किए बिना ऐसा कर सकते हैं।

आपको सूडो या किसी विशेषाधिकार की आवश्यकता नहीं है।

आपको किसी भी फाइल को संपादित करने की आवश्यकता नहीं है।

वर्चुअलएन्व को बूटस्ट्रैप आभासी वातावरण में स्थापित करें। अधिक बनाने के लिए उस वर्चुअल वातावरण का उपयोग करें। चूंकि वर्चुअलनेव पाइप और वितरित जहाजों के साथ जहाज, आप सब कुछ एक इंस्टॉल से मिलता है।

  1. वर्चुअलएनवी डाउनलोड करें:
  2. स्रोत टैरबॉल अनपैक करें
  3. स्वच्छ वर्चुअल वातावरण बनाने के लिए अनपॅक किए गए टैरबॉल का उपयोग करें। यह आभासी वातावरण दूसरों को "बूटस्ट्रैप" करने के लिए प्रयोग किया जाएगा। आपके सभी वर्चुअल वातावरण में स्वचालित रूप से पाइप और वितरित होगा।
  4. पाइप का उपयोग करके, उस बूटस्ट्रैप वातावरण में वर्चुअलएनवी स्थापित करें।
  5. अधिक बनाने के लिए उस बूटस्ट्रैप पर्यावरण का प्रयोग करें!

यहां बैश में एक उदाहरण दिया गया है:

# Select current version of virtualenv:
VERSION=12.0.7
# Name your first "bootstrap" environment:
INITIAL_ENV=bootstrap
# Set to whatever python interpreter you want for your first environment:
PYTHON=$(which python)
URL_BASE=https://pypi.python.org/packages/source/v/virtualenv

# --- Real work starts here ---
curl -O $URL_BASE/virtualenv-$VERSION.tar.gz
tar xzf virtualenv-$VERSION.tar.gz
# Create the first "bootstrap" environment.
$PYTHON virtualenv-$VERSION/virtualenv.py $INITIAL_ENV
# Don't need this anymore.
rm -rf virtualenv-$VERSION
# Install virtualenv into the environment.
$INITIAL_ENV/bin/pip install virtualenv-$VERSION.tar.gz

अब आप और अधिक बनाने के लिए अपने "बूटस्ट्रैप" पर्यावरण का उपयोग कर सकते हैं:

# Create a second environment from the first:
$INITIAL_ENV/bin/virtualenv py-env1
# Create more:
$INITIAL_ENV/bin/virtualenv py-env2

पागल हो जाना!

ध्यान दें

यह मानता है कि आप वर्चुअलएन्व के वास्तव में पुराने संस्करण का उपयोग नहीं कर रहे हैं। पुराने संस्करणों में झंडे की आवश्यकता होती है --no-site-packges (और पायथन, --distribute के संस्करण के आधार पर)। अब आप अपने बूटस्ट्रैप पर्यावरण को केवल python virtualenv.py path-to-bootstrap या python3 virtualenv.py path-to-bootstrap


पाइथन 3.4 आगे

पायथन 3.3 venv मॉड्यूल जोड़ता है, और पायथन 3.4 surepip मॉड्यूल जोड़ता है। यह बूटस्ट्रैपिंग पाइप को जितना आसान बनाता है:

पायथन -एम सुनिश्चित करें

शायद वर्चुअल वातावरण के अंदर ऐसा करने के लिए venv को कॉल करके पहले।

पीईपी 453 में गारंटीकृत पाइप का वर्णन किया गया है।


पुराने ओएस-प्रदत्त पायथन संस्करणों के शीर्ष पर, pyenv अंदर भी, अपग्रेड किए गए SSL मॉड्यूल स्थापित करने में मुझे कई समस्याएं हैं (नीचे देखें), इसलिए अब मैं pyenv उपयोग करता pyenv

pyenv एक नया पायथन संस्करण स्थापित करना और pyenv करना बहुत आसान बनाता है। प्रारंभ करना अन्य उत्तरों में सूचीबद्ध वर्चुअलएन्व के लिए व्यंजनों से कहीं अधिक आसान है:

  • मैक पर, brew install pyenv और लिनक्स पर, pyenv-installer उपयोग करें
  • यह आपको अंतर्निहित वर्चुअलएन्व समर्थन के साथ-साथ पायथन संस्करण स्विचिंग (यदि आवश्यक हो)
  • पाइथन 2 या 3 के साथ अच्छी तरह से काम करता है, कई संस्करण एक साथ स्थापित हो सकते हैं

यह सिस्टम पायथन से "नया पायथन" संस्करण और वर्चुअलएनवी को अपनाने के लिए बहुत अच्छा काम करता है। क्योंकि आप आसानी से एक और हालिया पायथन (पोस्ट 2.7.9) का उपयोग कर सकते हैं, एसएसएल मॉड्यूल पहले से ही अपग्रेड किए गए हैं, और निश्चित रूप से किसी भी आधुनिक वर्चुअलएन्व सेटअप की तरह आप सिस्टम पायथन मॉड्यूल से इन्सुलेटेड हैं।

कुछ अच्छे ट्यूटोरियल:

pyenv-virtualenv प्लगइन अब - प्रकार pyenv commands | grep virtualenv में बनाया गया है जांच करने के लिए pyenv commands | grep virtualenv । मैं शुरू करने के लिए pyenv-virtualenvwrapper प्लगइन का उपयोग नहीं करता - देखें कि आप pyenv-virtualenv के साथ कैसे चलते हैं जो अधिक pyenv में एकीकृत है, क्योंकि इसमें वर्चुअलएन्वापर क्या करता है।

pyenv rbenv (रूबी संस्करण स्विचिंग के लिए एक अच्छा उपकरण) पर मॉडलिंग किया गया है और इसकी एकमात्र निर्भरता बाश है।

  • pyenv बहुत समान नामित पायवेन से असंबंधित है - यह pyvenv समतुल्य है जो हाल ही के पायथन 3 संस्करणों का हिस्सा है, और पाइथन संस्करण स्विचिंग को संभाल नहीं करता है

चेतावनियां

पायनव के बारे में दो चेतावनियां:

  1. यह केवल एक बैश या इसी तरह के खोल से काम करता है - या अधिक विशेष रूप से, pyenv-virtualenv प्लगइन को dash पसंद नहीं है, जो उबंटू या डेबियन पर /bin/sh
  2. इसे एक इंटरैक्टिव लॉगिन शेल (जैसे टर्मिनल का उपयोग करके bash --login लॉगिन) से चलाया जाना चाहिए, जो उत्तरदायी उपकरण जैसे Ansible के साथ हासिल करना हमेशा आसान नहीं होता है।

इसलिए pyenv इंटरैक्टिव उपयोग के लिए सबसे अच्छा है, और स्क्रिप्टिंग सर्वर के लिए कम अच्छा है।

एसएसएल मॉड्यूल की समस्याएं

pyenv का उपयोग करने का एक कारण यह है कि पुरानी प्रणाली-प्रदान किए गए पायथन संस्करणों का उपयोग करते समय पाइथन एसएसएल मॉड्यूल को अपग्रेड करने में अक्सर समस्याएं होती हैं:


अच्छी खबर यह है कि अगर आपने python3.4 स्थापित किया है, pyvenv पहले ही स्थापित हो चुका है। बस ऐसे

pyvenv project_dir
source project_dir/bin/activate
python --version   
python 3.4.*

अब इस आभासी env में, आप इस परियोजना के लिए मॉड्यूल स्थापित करने के लिए पीआईपी का उपयोग कर सकते हैं।

इस आभासी env छोड़ दो, बस

deactivate

Virtualenvwrapper ( this अपडेट) को स्थापित करने का एक अच्छा तरीका यहां है।

virtualenv-1.11.4 डाउनलोड करें (आप here नवीनतम पा सकते हैं), इसे अनजिप करें, terminal खोलें

# Create a bootstrapenv and activate it:
$ cd ~
$ python <path to unzipped folder>/virtualenv.py bootstrapenv
$ source bootstrapenv/bin/activate

# Install virtualenvwrapper:
$ pip install virtualenvwrapper
$ mkdir -p ~/bootstrapenv/Envs

# append it to file `.bashrc`
$ vi ~/.bashrc
  source ~/bootstrapenv/bin/activate
  export WORKON_HOME=~/bootstrapenv/Envs
  source ~/bootstrapenv/bin/virtualenvwrapper.sh

# run it now.
$ source ~/.bashrc

यही वह है, अब आप mkvirtualenv env1 , lsvirtualenv mkvirtualenv env1 उपयोग कर सकते हैं

नोट: आप डाउनलोड फ़ोल्डरों से virtualenv-1.11.4.zip virtualenv-1.11.4 और virtualenv-1.11.4.zip virtualenv-1.11.4 को हटा सकते हैं।


यदि आप सुनिश्चित हैं कि आप यही करना चाहते हैं, तो सूडो पायथन setup.py इंस्टॉल करने में कोई समस्या नहीं है।

अंतर यह है कि यह प्रतिलिपि बनाने के लिए .py फ़ाइलों के लिए गंतव्य के रूप में आपके ओएस की साइट-पैकेज निर्देशिका का उपयोग करेगा।

इसलिए, यदि आप चाहते हैं कि पाइप ओएस चौड़ा हो, तो शायद यह जाने का तरीका है। मैं नहीं कहता कि दूसरों के रास्ते खराब हैं, लेकिन यह शायद काफी उचित है।





distribute