एक virtualenv में अजगर का उन्नयन


206

वहाँ एक virtualenv में इस्तेमाल अजगर के संस्करण को उन्नत करने का एक तरीका है (जैसे कि अगर एक बगफिक्स रिलीज निकलता है)?

मैं pip freeze --local > requirements.txtनिर्देशिका को हटा सकता था और pip install -r requirements.txt, लेकिन इसके लिए बड़े पुस्तकालयों के पुनर्स्थापना की बहुत आवश्यकता है, उदाहरण के लिए numpy, जिसका मैं बहुत उपयोग करता हूं।

मैं देख सकता हूँ कि यह एक फायदा है जब, जैसे, 2.6 -> 2.7 से अपग्रेड, लेकिन 2.7.x -> 2.7.y के बारे में क्या?


2
जबकि आप इसे काम करने के लिए कुछ रास्तों आदि को संशोधित करने में सक्षम हो सकते हैं। आखिरी चीज जो आप चाहते हैं वह उत्पादन से थोड़ा अलग वातावरण है। ज़रा सोचिए .. अगर विभिन्न संस्करणों को संकलित करने के बीच भी एक अंतर है, तो आप बग को ट्रैक करके सहेजे गए सभी समय पर बाहर जा सकते हैं। मैं बस एक नया virtualenv बनाने और सब कुछ पुनर्स्थापित करने के लिए समय लूंगा।
सैम डोलन

@ साइमन वॉकर बिल्कुल वही समस्या। मुझे बग फिक्स के लिए अजगर 3.5.3 को अपग्रेड करना होगा।
मोहम्मद शरीफ C

जवाबों:


77

क्या आपने यह देखा ? यदि मुझे वह उत्तर गलत नहीं लगा है, तो आप पुराने के ऊपर एक नया वर्चुअन बनाने की कोशिश कर सकते हैं। आपको बस यह पता होना चाहिए कि कौन सा पायथन आपके वर्चुअन का उपयोग करने वाला है (आपको अपना वर्चस्व संस्करण देखने की आवश्यकता होगी)।

यदि आपका virtualenv पुराने के समान python संस्करण के साथ स्थापित है और अपने virtualenv पैकेज को अपग्रेड करना कोई विकल्प नहीं है, तो आप अपने इच्छित python संस्करण के साथ virtualenv को स्थापित करने के लिए इसे पढ़ना चाह सकते हैं।

संपादित करें

मैंने इस दृष्टिकोण का परीक्षण किया है (एक जो पुराने के ऊपर एक नया वर्चस्व बनाता है) और यह मेरे लिए ठीक काम करता है। मुझे लगता है कि अगर आप अजगर 2.6 से 2.7 या 2.7 से 3.x में बदलते हैं तो आपको कुछ समस्याएँ हो सकती हैं लेकिन अगर आप एक ही संस्करण के अंदर अपग्रेड करते हैं (2.7 जैसा आप चाहते हैं) तो आपको कोई समस्या नहीं होनी चाहिए, जैसा कि सभी पैकेजों में है दोनों अजगर संस्करणों (2.7.x और 2.7.y संकुल) के लिए एक ही फ़ोल्डर में आयोजित किया जाता है आपके_नव / lib / python2.7 /) के अंदर।

यदि आप अपना वर्चुअन पायथन संस्करण बदलते हैं, तो आपको उस संस्करण के लिए फिर से अपने सभी पैकेजों को स्थापित करने की आवश्यकता होगी (या सिर्फ उन पैकेजों को लिंक करें जो आपको नए संस्करण पैकेज फ़ोल्डर में चाहिए, जैसे: your_env / lib / python_newebersion / साइट-संकुल)


13
वह विशेष रूप से यदि संभव हो तो किसी भी पैकेज को फिर से स्थापित नहीं करना चाहता था। जाहिर है कि आपने स्रोत से कभी भी खतना स्थापित नहीं किया है यदि आप नहीं जानते कि यह क्यों मायने रखता है?) संकेत: यह एक लूज़ूओओओओओओंग समय लेता है।
अंती हापला

हाँ, मैं समझता हूँ कि लेकिन ऐसा लगता है कि अगर वह एक virtualenv दूसरे के शीर्ष में, संकुल खो नहीं रहे हैं, तो वह numpy या किसी अन्य पैकेज को पुनर्स्थापित करने के लिए नहीं होगा। फिर भी, मुझे लगता है कि उसे असफल होने की स्थिति में एक नए वर्चस्व में यह कोशिश करनी चाहिए।
मारीनोबियानी

मैं अपने मामले को आराम देता हूं, मेरा मानना ​​है कि नए वर्चुनेल संस्करण वास्तव में जगह में उन्नयन करते हैं, हालांकि पुराने संस्करणों के लिए, उन्होंने अजगर निष्पादन योग्य को भी अधिलेखित नहीं किया, जिससे कम से कम एक अजगर बगफिक्स रिलीज के साथ समस्याएं पैदा हुईं।
अंती हापला

4
यह मेरे लिए काम नहीं करता था और ऐसा लगता है कि यह माना नहीं जाता है: github.com/pypa/virtualenv/issues/437
Kentzo

1
मैं एक नया बनाने की कोशिश की virtualenvएक पुरानी के शीर्ष पर है, और यह किया था काम। मुझे -pइसे अजगर के सही संस्करण पर इंगित करने के लिए निर्दिष्ट करना पड़ा।
osa

76

यदि आप पायथन 3.3+ के साथ आने वाले वेनव मॉड्यूल का उपयोग करते हैं, तो यह एक --upgradeविकल्प का समर्थन करता है। प्रति डॉक्स :

पायथन के इस संस्करण का उपयोग करने के लिए पर्यावरण निर्देशिका को अपग्रेड करें, यह मानते हुए कि पायथन को अपग्रेड किया गया है

python3 -m venv --upgrade ENV_DIR

1
दुर्भाग्य से, यह उबंटू 16.04 पर काम नहीं करता है, जहां वे टूट गए venvऔर इस आधार पर इसे ठीक करने से इनकार कर दिया कि "आप बस वर्चुनेल का उपयोग कर सकते हैं"। संपादित करें: वास्तव में, यह काम करता है! यह सिर्फ "enspip" के बारे में एक त्रुटि संदेश भी दिखाता है।
rspeer

2
मैंने अपने सिस्टम पर अजगर को 3.5.1 से 3.6.4 तक अपग्रेड किया। और मेरे वर्चुअनव पर अजगर को अपग्रेड करने के लिए, मुझे स्पष्ट रूप से कमांड में python3.6 का उल्लेख करना था:python3.6 -m venv --upgrade <path_of_existing_env>
सरफराज अहमद

1
मेरे मामले में, bin/pythonऔर bin/python3अभी भी पुराने python3.4बाइनरी से जुड़ा हुआ है , और मुझे मैन्युअल रूप से लिंक सेट करना था। इसके अलावा, क्या अब पुराने अजगर संस्करण को हटाने का एक तरीका है ?
जेन्स

4
मुझे मिल गया Error: Command '['/Users/me/Sites/site/venv3/bin/python3', '-Im', 'ensurepip', '--upgrade', '--default-pip']' returned non-zero exit status 1.> इसका क्या मतलब है? मुझे कोई सक्रिय अजगर प्रक्रिया नहीं दिख रही है, अपग्रेड नहीं कर सकता।
user305883

1
@ user305883 मुझे अपने सिस्टम पायथन संस्करण को 3.5 से 3.6 तक उन्नत करने के बाद (और 3.5 को हटा दिया गया) एक समान त्रुटि मिली। मुझे 3.5 को पुनः स्थापित करना था और python3.6 -m venv --upgrade ENV_DIRइसे काम करने के लिए चलाना था । मुझे लगता है कि मुझे अभी भी कुछ प्रतीकात्मक लिंक अपडेट करने होंगे ENV_DIR/bin। इसलिए, चाल को नए पायथन संस्करण के साथ अद्यतन करना था जबकि पुराना संस्करण अभी भी स्थापित था।
एस्ट्रोफ्लोयड

24

फिर से अपडेट किया गया: निम्नलिखित विधि वर्चुअनव के नए संस्करणों में काम नहीं कर सकती है। इससे पहले कि आप पुराने virtualenv में संशोधन करने का प्रयास करें, आपको एक आवश्यकता फ़ाइल (pip freeze > requirements.txt)में निर्भरता को सहेजना चाहिएऔर इसे कहीं और बैकअप करना चाहिए। यदि कुछ भी गलत होता है, तो आप अभी भी एक नया वर्चुअन बना सकते हैं और उसमें पुरानी निर्भरताएँ स्थापित कर सकते हैं (pip install -r requirements.txt)।

अपडेट किया गया: मैंने मूल रूप से उत्तर देने के 5 महीने बाद उत्तर बदल दिया। निम्नलिखित विधि अधिक सुविधाजनक और मजबूत है।

साइड इफेक्ट: यहSymbol not found: _SSLv2_methodअपवादको भी ठीक करताहै जब आपimport sslपायथन को v2.7.8 में अपग्रेड करने के बाद वर्चुअल वातावरण मेंकरते हैं।

सूचना: वर्तमान में, यह केवल पायथॉन 2.7.x के लिए है


यदि आप OSB पर Homebrew Python का उपयोग कर रहे हैं deactivate, तो पहले सभी virtualenv, फिर Python को अपग्रेड करें:

brew update && brew upgrade python

निम्न आदेश चलाएँ ( <EXISTING_ENV_PATH>आपके वर्चुअल वातावरण का पथ है):

cd <EXISTING_ENV_PATH>
rm .Python
rm bin/pip{,2,2.7}
rm bin/python{,2,2.7}
rm -r include/python2.7
rm lib/python2.7/*
rm -r lib/python2.7/distutils
rm lib/python2.7/site-packages/easy_install.*
rm -r lib/python2.7/site-packages/pip
rm -r lib/python2.7/site-packages/pip-*.dist-info
rm -r lib/python2.7/site-packages/setuptools
rm -r lib/python2.7/site-packages/setuptools-*.dist-info

अंत में, अपने आभासी वातावरण को फिर से बनाएं:

virtualenv <EXISTING_ENV_PATH>

हां, तो पुराने अजगर कोर फ़ाइलों और मानक पुस्तकालयों करने से (प्लस setuptoolsऔर pip) निकाल दिए जाते हैं, जबकि में स्थापित कस्टम पुस्तकालयों, site-packages, संरक्षित और काम कर रहे हैं जैसे ही वे शुद्ध पायथन में हैं। बाइनरी लाइब्रेरीज़ को ठीक से काम करने के लिए पुन: इंस्टॉल करने की आवश्यकता हो सकती है या नहीं।

यह Django स्थापित के साथ 5 आभासी वातावरण पर मेरे लिए काम किया।

BTW, यदि ./manage.py compilemessagesबाद में काम नहीं कर रहा है , तो यह प्रयास करें:

brew install gettext && brew link gettext --force

मुझे हटाने के लिए एकमात्र फ़ाइल फ़ाइल थी bin/python
कोएन।

कुछ पुराने संस्करण पायथन के लिए, हटाना setuptoolsऔर pipआवश्यक है।
रॉकलाईट

1
मुझे भी डिलीट करना पड़ा <EXISTING_ENV_PATH>/.Pythonक्योंकि इससे वर्चुअलएनवी क्रिएशन टूट गया।
किरण जोनलगड्डा

2
इस उत्तर के आधार पर मैंने थोड़ी स्क्रिप्ट लिखी (पूरी अटेंशन के साथ): burgundywall.com/post/update-all-python-virtual-en एन्वायरमेंट
कर्ट

आप वास्तव में अपने वर्चुअल वातावरण को चलाकर आसानी से निकाल सकते हैं rmvirtualenv <env_name>और इसके सभी पंक्तिबद्ध निर्भरताएँ हटा देंगे :) अधिक देखें: virtualenvwrapper.readthedocs.io/en/latest/…
निक लुकास

7

मैं पुराने के शीर्ष पर एक नया वर्चुअवेन बनाने में सक्षम नहीं था। लेकिन पाइप में ऐसे उपकरण हैं जो एक नए नए वेव में आवश्यकताओं को फिर से स्थापित करने के लिए बहुत तेज़ बनाते हैं। पिप आपकी आवश्यकताओं में से प्रत्येक आइटम का निर्माण कर सकता है। एक पहिया पैकेज में, और एक स्थानीय कैश में स्टोर करें। जब आप एक नया वेनव बनाते हैं और उसमें पाइप इंस्टॉल चलाते हैं, तो पाइप स्वचालित रूप से प्रीबिल्ट व्हील्स का उपयोग करेगा यदि यह उन्हें मिल जाता है। प्रत्येक मॉड्यूल के लिए सेटअप सेटअप चलाने की तुलना में पहिए बहुत तेज गति से स्थापित होते हैं।

मेरा ~ / .pip / pip.conf इस तरह दिखता है:

[global]
download-cache = /Users/me/.pip/download-cache
find-links =
/Users/me/.pip/wheels/

[wheel]
wheel-dir = /Users/me/.pip/wheels

मैं पहिया ( pip install wheel) स्थापित करता हूं , फिर चलाएं pip wheel -r requirements.txt। यह मेरे पहिए में व्हील-डायर में निर्मित पहियों को संग्रहीत करता है।

तब से, किसी भी समय मैं इनमें से किसी भी आवश्यकता को स्थापित करता हूं, यह उन्हें पहियों से स्थापित करता है, जो बहुत जल्दी है।


1
ज्यादातर लोगों के लिए मुझे लगता है कि काम करने के लिए पाइप मशीनरी का उपयोग करना समझ में आता है, लेकिन किसी ने भी जो अपने वर्चुअलाइजेशन को पोस्टपेक्ट, प्री-एक्टिवेट, इत्यादि के लिए अनुकूलित किया है, यह एक वांछनीय विकल्प नहीं है क्योंकि यह सब खो गया है और मैन्युअल रूप से बंद किया जाना है।
dpwrussell

6

मौजूदा virtualenvwrapper प्रोजेक्ट के लिए पायथन संस्करण को कैसे अपग्रेड करें और उसी नाम को रखें

मैं विशेष रूप से मौजूदा जवाब मेरे लिए ऐसा नहीं किया क्योंकि मैं विशेष रूप से डौग Hellmann के उत्कृष्ट virtualenvwrapper का उपयोग कर किसी के लिए एक जवाब जोड़ रहा हूँ ।

कुछ संदर्भ:

  • मैं कुछ परियोजनाओं पर काम करता हूं जो पायथन 2 और कुछ हैं जो पायथन 3 हैं; जब मैं उपयोग करना पसंद करूंगा python3 -m venv, यह पायथन 2 वातावरण का समर्थन नहीं करता है
  • जब मैं एक नई परियोजना शुरू करता हूं, तो मैं उपयोग mkprojectकरता हूं जो आभासी वातावरण बनाता है, एक खाली परियोजना निर्देशिका बनाता है, और इसमें सीडी लगाता है
  • मैं workonपायथन संस्करण के बावजूद किसी भी परियोजना को सक्रिय करने के लिए virtualenvwrapper की कमांड का उपयोग करना जारी रखना चाहता हूं

दिशा:

मान लें कि आपकी मौजूदा परियोजना का नाम है fooऔर वर्तमान में पायथन 2 ( mkproject -p python2 foo) चल रहा है , हालांकि कमांड समान हैं चाहे 2.x से 3.x, 3.6.0 से 3.6.1 तक अपग्रेड हो, आदि मैं भी आपको मान रहा हूं ' वर्तमान में सक्रिय वर्चुअल वातावरण के अंदर है।

1. पुराने आभासी वातावरण को निष्क्रिय करें और निकालें:

$ deactivate
$ rmvirtualenv foo

ध्यान दें कि यदि आपने हुक करने के लिए कोई कस्टम कमांड जोड़ा है (जैसे, bin/postactivate) तो आपको पर्यावरण को हटाने से पहले उन्हें सहेजना होगा।

2. एक अस्थायी निर्देशिका में वास्तविक परियोजना को रोकें:

$ cd ..
$ mv foo foo-tmp

3. नया आभासी वातावरण बनाएं (और प्रोजेक्ट dir) और सक्रिय करें:

$ mkproject -p python3 foo

4. खाली जनरेटेड प्रोजेक्ट डायर को वास्तविक प्रोजेक्ट से बदलें, प्रोजेक्ट डायर में वापस बदलें:

$ cd ..
$ mv -f foo-tmp foo
$ cdproject

5. निर्भरता को फिर से स्थापित करें, नए पायथन संस्करण की पुष्टि करें, आदि:

$ pip install -r requirements.txt
$ python --version

यह एक आम उपयोग है, मैं की तरह कुछ जोड़ने के लिए एक पीआर खोलने पर विचार करेंगे $ upgradevirtualenv/ $ upgradeprojectकरने के लिए virtualenvwrapper।


1
हाँ कृपया। मैं इस के माध्यम से आधा हो गया और बड़ी समस्याएं मिली ... एक चेक अच्छा होगा क्योंकि पहला कदम एक बार हटाए जाने के बाद अपरिवर्तनीय है (मेरे वर्तमान ज्ञान के लिए)
क्रिस फ्रिसिना

2

यह दृष्टिकोण हमेशा मेरे लिए काम करता है:

# First of all, delete all broken links. Replace  my_project_name` to your virtual env name
find ~/.virtualenvs/my_project_name/ -type l -delete
# Then create new links to the current Python version
virtualenv ~/.virtualenvs/my_project_name/
# It's it. Just repeat for each virtualenv located in ~/.virtualenvs

से लिया गया:


1

मैंने अपनी होम डाइरेक्टरी को एक मैक से दूसरे (माउंटेन लायन टू योसेमाइट) में स्थानांतरित किया और टूटे हुए वर्चुअन के बारे में तब तक महसूस नहीं किया जब तक कि मैं पुराने लैपटॉप को नहीं पकड़ता। मेरे पास पाइथन 2.7 के लिए वर्चुअनव बिंदु था brewऔर जब से योसेमाइट पाइथन 2.7 के साथ आया, मैं अपने वर्चुअन को सिस्टम पाइथन में अपडेट करना चाहता था। जब मैं virtualenvमौजूदा निर्देशिका के शीर्ष पर भाग गया, तो मुझे OSError: [Errno 17] File exists: '/Users/hdara/bin/python2.7/lib/python2.7/config'त्रुटि हो रही थी । परीक्षण और त्रुटि से, मैंने कुछ लिंक हटाकर और कुछ और मैन्युअल रूप से ठीक करके इस मुद्दे पर काम किया। यह वही है जो मैंने अंततः किया था (@Rockalite ने जैसा किया था, लेकिन सरल है):

cd <virtualenv-root>
rm lib/python2.7/config
rm lib/python2.7/lib-dynload
rm include/python2.7
rm .Python
cd lib/python2.7
gfind . -type l -xtype l | while read f; do ln -s -f /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/${f#./} $f; done

इसके बाद, मैं मौजूदा डायरेक्टरी के शीर्ष पर virtualenv चलाने में सक्षम था।


1

Python3 को स्थापित और अपग्रेड करने के लिए Homebrew का उपयोग करते हुए OS X या macOS पर, मुझे python -m venv --upgrade ENV_DIRकाम करने से पहले प्रतीकात्मक लिंक को हटाना होगा।

मैंने उन्नयन में निम्नलिखित को सहेज लिया_प्यथोन 3.श। इसलिए मुझे याद होगा कि अब से कितने महीने बाद जब मुझे इसे फिर से करने की आवश्यकता होगी:

brew upgrade python3
find ~/.virtualenvs/ -type l -delete
find ~/.virtualenvs/ -type d -mindepth 1 -maxdepth 1 -exec python3 -m venv --upgrade "{}" \;

अद्यतन: जबकि यह पहली बार में अच्छा काम करता था, जब मैंने py.test चलाया तो इसमें एक त्रुटि थी। अंत में मैंने आवश्यकताओं फ़ाइल से वातावरण को फिर से बनाया।


py.testइसलिए काम नहीं करता क्योंकि `~ / .virtualenvs / myenv / bin / python3.7 एक सिमलिंक नहीं है, इसलिए अपडेट नहीं होता है।
ऐश बर्लिन-टेलर

आह वास्तव में, समस्या यह है ~/.virtualenvs/myenv/.Pythonकि जो एक सहानुभूति है।
ऐश बर्लिन-टेलर

1

यदि आप उपयोग कर रहे हैं pipenv, तो मुझे नहीं पता है कि किसी वातावरण को जगह में अपग्रेड करना संभव है, लेकिन कम से कम संस्करण के उन्नयन के लिए यह काफी स्मार्ट लगता है कि नए वातावरण का निर्माण करते समय खरोंच से पैकेजों का पुनर्निर्माण न करें। जैसे, 3.6.4 से 3.6.5 तक:

$ pipenv --python 3.6.5 install
Virtualenv already exists!
Removing existing virtualenv
Creating a v$ pipenv --python 3.6.5 install
Virtualenv already exists!
Removing existing virtualenv
Creating a virtualenv for this project
Using /usr/local/bin/python3.6m (3.6.5) to create virtualenv
Running virtualenv with interpreter /usr/local/bin/python3.6m
Using base prefix '/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6'
New python executable in /Users/dmoles/.local/share/virtualenvs/autoscale-aBUhewiD/bin/python3.6
Also creating executable in /Users/dmoles/.local/share/virtualenvs/autoscale-aBUhewiD/bin/python
Installing setuptools, pip, wheel...done.

Virtualenv location: /Users/dmoles/.local/share/virtualenvs/autoscale-aBUhewiD
Installing dependencies from Pipfile.lock (84dd0e)…
  🐍   ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 47/47  00:00:24
To activate this project's virtualenv, run the following:
 $ pipenv shell
$ pipenv shell
Spawning environment shell (/bin/bash). Use 'exit' to leave.
. /Users/dmoles/.local/share/virtualenvs/autoscale-aBUhewiD/bin/activate
bash-3.2$ . /Users/dmoles/.local/share/virtualenvs/autoscale-aBUhewiD/bin/activate
(autoscale-aBUhewiD) bash-3.2$ python
Python 3.6.5 (default, Mar 30 2018, 06:41:53) 
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>>

बहुत बढ़िया! इस मणि के लिए धन्यवाद
मयूर पाटिल

1

मैं सिर्फ स्पष्ट करना चाहता हूं, क्योंकि कुछ उत्तर संदर्भित करते हैं venvऔर अन्य को संदर्भित करते हैं virtualenv

उपयोग की -pया --pythonध्वज पर समर्थित है virtualenv, लेकिन पर नहीं venv। यदि आपके पास एक से अधिक पायथन संस्करण हैं और आप यह निर्दिष्ट करना चाहते हैं कि किसके venvसाथ बनाना है , तो इसे कमांड लाइन पर करें, जैसे:

malikarumi@Tetuoan2:~/Projects$ python3.6 -m venv {path to pre-existing dir you want venv in}

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


1

चरण 1: आवश्यकता को रोकें और मौजूदा env का बैक-अप लें

pip freeze > requirements.txt
deactivate
mv env env_old

चरण 2: पायथॉन 3.7 स्थापित करें और वायरल वातावरण को सक्रिय करें

sudo apt-get install python3.7-venv
python3.7 -m venv env
source env/bin/activate
python --version

चरण 3: आवश्यकताओं को स्थापित करें

sudo apt-get install python3.7-dev
pip3 install -r requirements.txt

0

समस्या वाले सभी के लिए

त्रुटि: कमांड '[' / उपयोगकर्ता / मेरे / साइट / साइट / venv3 / bin / python3 ',' -Im ',' enspip ',' --upgrad ',' --default-pip '] गैर-शून्य निकास की स्थिति 1।

आपको python3.6-venv इंस्टॉल करना होगा

 sudo apt-get install python3.6-venv
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.