PATH ने 'सबसे महत्वपूर्ण: YadaYadaYada नाम का कोई मॉड्यूल नहीं


231

मैंने एक मैक पर pytest स्थापित करने के लिए easy_install का उपयोग किया और एक फाइल संरचना के साथ एक परियोजना के लिए परीक्षण लिखना शुरू कर दिया, जिसे पसंद है:

repo/
repo/app.py
repo/settings.py
repo/models.py
repo/tests/
repo/tests/test_app.py

चलाने py.testजबकि रेपो निर्देशिका में, सब कुछ बर्ताव करता है के रूप में आप उम्मीद करेंगे

लेकिन जब मैं कोशिश करता हूं कि या तो linux या windows (दोनों का उन पर pytest 2.2.3) में यही बात है, तो जब भी वह अपने एप्लिकेशन पथ से किसी चीज का पहला आयात करता है, तो वह भौंकता है। उदाहरण के लिए कहोfrom app import some_def_in_app

क्या मुझे इन प्रणालियों पर py.test चलाने के लिए अपने PATH का संपादन करने की आवश्यकता है? क्या किसी ने यह अनुभव किया है?


4
यहां इसे सेटपूल के साथ ठीक करने का तरीका है।
21

4
कृपया @ उत्तर को देखें और अपने स्वीकार किए गए बदलाव को बदलने पर विचार करें, यदि SO इस लंबे समय के बाद अनुमति देता है: बहुत बेहतर!
डेविड

जवाबों:


91

यदि आप cdपरीक्षण निर्देशिका में हैं , तो स्रोत फ़ोल्डर पायथन के पथ में नहीं है ।

आपके पास 2 विकल्प हैं:

  1. परीक्षण फ़ाइलों में मैन्युअल रूप से पथ जोड़ें, कुछ इस तरह से:

    import sys, os
    myPath = os.path.dirname(os.path.abspath(__file__))
    sys.path.insert(0, myPath + '/../')
  2. Env var के साथ परीक्षण चलाएं PYTHONPATH=../


11
जब मैं cdएक निर्देशिका के लिए हूँ ? मैं py.testअपनी जड़ से भाग रहा हूं। जब तक मैं गलत नहीं हूँ और आप का मतलब है कि मेरे फ़ोल्डर्स के माध्यम से सबसे तेज़ चलता है
मैट्टोडोड

अगर यह एक cdमुद्दा था , तो मैं इसे मैक पर भी नहीं मारूंगा?
मट्टोडोड

ओह, मैंने गलत समझा और सोचा कि यह परीक्षण निर्देशिका से काम नहीं करता है। अभी भी सुझाव 1 में चाल काम करेगी। मैं केवल लिनक्स का उपयोग करता हूं इसलिए मैं अन्य ओएस पर व्यवहार की व्याख्या नहीं कर सकता।
Not_a_Golfer

क्या आपके पास अपने सभी टेस्टहोम फ़ाइलों की तरह एक आयात है?
मैट्टोडोड

4
हां, लेकिन मेरी निर्देशिका संरचना आमतौर पर थोड़ी अलग है - मैं आमतौर पर रूट निर्देशिका के तहत / src और / परीक्षण करता हूं।
Not_a_Golfer

275

मुझे यकीन नहीं है कि क्यों py.test PYTHONPATH में वर्तमान निर्देशिका को नहीं जोड़ता है, लेकिन यहां एक वर्कअराउंड (आपकी रिपॉजिटरी की जड़ से निष्पादित) किया जा रहा है:

python -m pytest tests/

यह काम करता है क्योंकि पायथन आपके लिए PYTHONPATH में वर्तमान निर्देशिका जोड़ता है।


2
इसके लिए निरपेक्ष लोगों के सापेक्ष आयात को फिर से लिखना आवश्यक है, यदि आपके पास एप्लिकेशन को उस स्तर पर चलाने के लिए कोड नहीं है, जहां से आप कमांड निष्पादित करते हैं। उदाहरण के लिए: project/test/all-my-testsऔर project/src/app.pyउस परिवर्तन के कारण, किसी को app.pyअप्रत्यक्ष रूप से एक __main__.pyफ़ाइल का उपयोग करके कॉल करना होगा project/src, ताकि कोई कॉल का उपयोग कर सके python -m src। सुंदर गन्दा सामान जहाँ तक मैं बता सकता हूँ।
ज़ेल्फिर कल्टस्टाल

3
@ ज़ेलफिर: पूर्ण आयात का उपयोग करना एक अनुशंसित अभ्यास है। हबनाबिट के पास पैकेजिंग सर्वोत्तम प्रथाओं के बारे में एक अच्छा लेख है: blog.habnab.it/blog/2013/07/21/python-packages-and-you , और PEP8 का कहना है कि "निहित सापेक्ष आयातों का उपयोग कभी नहीं किया जाना चाहिए और अजगर में हटा दिया गया है। 3. " देखें: python.org/dev/peps/pep-0008
एपर्टेक्सx

1
@Apteryx आप "परियोजना-निरपेक्ष" सही मतलब है? क्योंकि /home/user/dev/projectxyz/src ...वास्तव में चीजें बहुत खराब होंगी और ज्यादातर मामलों में अन्य मशीनों पर नहीं चलेंगी। मुझे लगता है कि मेरा मतलब क्या है, कि मुझे हमेशा पूरे प्रोजेक्ट रूट को मॉड्यूल पथ पर लिखना होगा, भले ही मॉड्यूल फ़ाइल चलाने के समान फ़ोल्डर में हो। मुझे नहीं पता था कि यह सबसे अच्छा अभ्यास माना जाता है, इसलिए यह उपयोगी जानकारी है, धन्यवाद। मैं pep8 के अधिकांश से सहमत हूं, हालांकि यह अभी भी सही नहीं है।
ज़ेल्फिर कल्टस्टाहल

1
@Zelphir, हाँ, यही मेरा मतलब है। मेरा मानना ​​है कि अजगर में पूर्ण आयात शब्द हमेशा "प्रोजेक्ट-निरपेक्ष" का संदर्भ देता है। देखें: python.org/dev/peps/pep-0328/#rationale-for-absolute-imports । वास्तव में, मुझे पूरा यकीन है कि आप यादृच्छिक, निरपेक्ष पथ स्थानों से आयात नहीं कर सकते, कम से कम डिफ़ॉल्ट "आयात" तंत्र का उपयोग कर रहे हैं।
एपर्टेक्स

4
मैंने __init__.pyपरीक्षणों में जोड़ा है, जिससे समस्या हल हो गई है। अब मैं उपयोग कर सकता हूंpytest
किरण कुमार कोटरी

154

conftest उपाय

कम से कम इनवेसिव समाधान निर्देशिका conftest.pyमें नामित एक खाली फ़ाइल जोड़ रहा है repo/:

$ touch repo/conftest.py

बस। मैनलिंग करने के लिए कस्टम कोड लिखने की आवश्यकता नहीं है sys.pathया याद रखना कि PYTHONPATHसाथ खींचें , या __init__.pyडायर में रखें जहां यह नहीं है।

परियोजना निर्देशिका बाद में:

repo
├── conftest.py
├── app.py
├── settings.py
├── models.py
└── tests
     └── test_app.py

व्याख्या

pytestके लिए दिखता conftestपरीक्षण संग्रह पर मॉड्यूल कस्टम हुक और जुड़नार इकट्ठा करने के लिए, और आदेश उन लोगों से कस्टम वस्तुओं को आयात करने में, pytestकी पेरेंट निर्देशिका कहते हैं conftest.pyकरने के लिएsys.path (इस मामले में repoनिर्देशिका)।

अन्य परियोजना संरचनाएं

यदि आपके पास अन्य प्रोजेक्ट संरचना है, conftest.pyतो पैकेज को रूट रूट में रखें (वह जिसमें पैकेज होते हैं, लेकिन पैकेज स्वयं नहीं है, इसलिए इसमें शामिल नहीं है __init__.py), उदाहरण के लिए:

repo
├── conftest.py
├── spam
   ├── __init__.py
   ├── bacon.py
   └── egg.py
├── eggs
   ├── __init__.py
   └── sausage.py
└── tests
     ├── test_bacon.py
     └── test_egg.py

src ख़ाका

हालाँकि इस दृष्टिकोण का उपयोग srcलेआउट के साथ किया जा सकता है ( dir conftest.pyमें जगह src):

repo
├── src
   ├── conftest.py
   ├── spam
      ├── __init__.py
      ├── bacon.py
      └── egg.py
   └── eggs 
       ├── __init__.py
       └── sausage.py
└── tests
     ├── test_bacon.py
     └── test_egg.py

खबरदार कि लेआउट के अर्थ और लाभों srcको PYTHONPATHकम करने के लिए जोड़ना src! आप भंडार से कोड का परीक्षण करने के साथ समाप्त हो जाएंगे न कि स्थापित पैकेज से। यदि आपको इसे करने की आवश्यकता है, तो हो सकता है कि आपको srcdir की आवश्यकता न हो ।

यहाँ से कहाँ जाएं

बेशक, conftestस्रोत कोड की खोज में मदद करने के लिए मॉड्यूल केवल कुछ फाइलें नहीं हैं; यह वह जगह है जहाँ pytestरूपरेखा के सभी परियोजना-विशिष्ट संवर्द्धन और आपके परीक्षण सूट का अनुकूलन होता है। मॉड्यूल pytestपर बहुत सारी जानकारी उनके डॉक्स मेंconftest बिखरी हुई है ; के साथ शुरू : स्थानीय प्रति निर्देशिका प्लगइन्सconftest.py

इसके अलावा, SO के conftestमॉड्यूल पर एक उत्कृष्ट प्रश्न है : py.test में, conftest.py फ़ाइलों का क्या उपयोग है?


2
@ aaa90210 हालांकि मैं आपके मुद्दे को पुन: पेश नहीं कर सकता (किसी भी स्तर पर रूट डाइर में कंफ़ेस्ट से आयात करना), आपको कभी भी कॉन्टेस्ट फ़ाइलों से आयात नहीं करना चाहिए क्योंकि यह आरक्षित नाम है pytestऔर ऐसा करने की दृढ़ता से सलाह दी जाती है। ऐसा करके, आप भविष्य की त्रुटियों के लिए बीज लगाते हैं। नाम का एक और मॉड्यूल बनाएं और utils.pyवहां परीक्षणों में पुन: उपयोग के लिए कोड रखें।
19

4
थम्स अप! यह एकमात्र समाधान है जो मेरे लिए अच्छा काम करता है।
130nrd

4
बिल्कुल स्वीकृत जवाब होना चाहिए - धन्यवाद!
मार्टिन पेक

2
तार्किक रूप से, conftest.pyएप्लिकेशन कोड से संबंधित नहीं है और, imo, इसे नीचे रखना src/सही नहीं है।
निक ओ ललाई

2
यह उत्तर SO पर एक निश्चित हेडर होना चाहिए। बहुत बहुत धन्यवाद।
ऋगोबर्टा रविओलिनी

119

मुझे भी यही समस्या थी। मैंने __init__.pyअपनी testsनिर्देशिका में एक खाली फ़ाइल जोड़कर इसे ठीक किया ।


77
ध्यान दें कि यह py.test द्वारा अनुशंसित नहीं है : avoid “__init__.py” files in your test directories. This way your tests can run easily against an installed version of mypkg, independently from the installed package if it contains the tests or not.SRC: pytest.org/latest/goodpractises.html
K.-Michael Aye

24
मैं इसी सवाल के साथ यहां आया और __init__.pyअपने परीक्षण निर्देशिका से हटाने को मेरे लिए हल कर दिया।
101

3
@ मैफ्रो मैं समस्या नहीं देखता? परीक्षणों को आयात करने योग्य कोड नहीं होना चाहिए, वे आपके परीक्षण धावक द्वारा पाए जाते हैं। केवल परीक्षण के लिए कोड एक स्थापित पैकेज / मॉड्यूल होना चाहिए, न कि परीक्षण।
के।-माइकल एवाई

5
स्थापित __init__.pyउप-निर्देशिकाओं में test/विशिष्ट परीक्षणों को चलाने के लिए पूर्ण-आयात निर्देशिकाओं को जोड़ने के लिए इन-इंस्टाल्ड मॉड्यूल्स के विरुद्ध काम करता है। धन्यवाद।
ब्रूस गुइंटा

7
वहाँ आप जाते हैं: doc.pytest.org/en/latest/goodpractices.html वास्तव में Google के साथ खोजना आसान है।
के।-माइकल ऐ

46

pytestअपने आप को एक मॉड्यूल के रूप में चलाएं : python -m pytest tests


3
यह एक काम कर समाधान लगता है, लेकिन क्या कोई समझा सकता है? मैं इसके बजाय python -m pytest"क्योंकि यह काम करता है" के अलावा किसी भी स्पष्टीकरण के बिना अंतर्निहित कारण को ठीक कर देगा
जेने एनबर्ग

4
यह तब होता है जब प्रोजेक्ट पदानुक्रम उदाहरण के लिए होता है: package/src package/testsऔर testsआप से आयात करते हैं src। एक मॉड्यूल के रूप में निष्पादन निष्पादन स्थान के सापेक्ष आयात पर विचार करेगा।
स्टेफानो मेसिना

1
इस समाधान ने मेरी मदद की, धन्यवाद! इसका कारण पायथन संस्करण में संघर्ष के कारण था। पहले पायथन संस्करण के लिए पाइस्टेस्ट टेस्ट काम करता है। मेरी स्थिति में, मेरा अजगर संस्करण ३. p.१ है, पायथन एम-पाइटेस्ट टेस्ट काम करता है, लेकिन पाइस्टेस्ट टेस्ट नहीं।
रक्सी झा

1
से Pytest "के साथ अजगर -m pytest [...] pytest के बजाय [...] पैदावार लगभग बराबर व्यवहार, सिवाय इसके कि पूर्व कॉल sys.path को वर्तमान निर्देशिका जोड़ देगा। Pytest चल रहा है"
मोद एननागी

37

आप प्रोजेक्ट रूट में PYTHONPATH के साथ दौड़ सकते हैं

PYTHONPATH=. py.test

या संपादन योग्य आयात के रूप में पाइप इंस्टॉल का उपयोग करें

pip install -e .   # install package using setup.py in editable mode

3
निर्देशिका संरचना testमें नहीं निर्देशिका के साथ मेरे लिए काम नहीं किया और निर्देशिका और निर्देशिका srcदोनों को बुला रहा है । testsrc
ज़ेलफिर कलस्टहल 22

21

मैंने इसे आपके प्रश्न और मेरे स्वयं के भ्रम के उत्तर के रूप में बनाया है। मुझे उम्मीद है यह मदद करेगा। PY.tONPATH पर py.test कमांड लाइन और tox.ini दोनों पर ध्यान दें।

https://github.com/jeffmacdonald/pytest_test

विशेष रूप से: आपको py.test और टॉक्सिक को बताना होगा कि आपके द्वारा शामिल किए गए मॉड्यूल को कहां ढूंढना है।

Py.test के साथ आप ऐसा कर सकते हैं:

PYTHONPATH=. py.test

और जहर के साथ, इसे अपने tox.ini में जोड़ें:

[testenv]
deps= -r{toxinidir}/requirements.txt
commands=py.test
setenv =
    PYTHONPATH = {toxinidir}

1
क्या आप अपने द्वारा जुड़ी परियोजना के लिए संक्षिप्त विवरण दे सकते हैं?
JF Meier

1
शायद इसकी सिर्फ मेरे लिए, लेकिन परियोजना पर README बहुत विस्तृत है, और स्टैकओवरफ़्लो पर मेरी टिप्पणी कहती है कि मैंने रेपो क्यों बनाया।
जेफ मैकडोनाल्ड

5
जबकि यह कड़ाई से आवश्यक नहीं है, यह एक सामान्य नीति है कि उत्तर में ही उत्तर की मुख्य सामग्री होनी चाहिए क्योंकि यह सुनिश्चित करता है कि यह उत्तर अब से x वर्षों में समझा जा सकता है जब लिंक किया गया संसाधन लंबे समय तक चला जा सकता है।
JF Meier

:) ओह अच्छा। हां के लिए इंटरनेट।
जेफ मैकडोनाल्ड

9

फ्लास्क में भी मुझे यही समस्या थी।

जब मैंने जोड़ा:

__init__.py

फ़ोल्डर का परीक्षण करने के लिए, समस्या गायब हो गई :)

संभवतः एप्लिकेशन फ़ोल्डर परीक्षणों को मॉड्यूल के रूप में नहीं पहचान सका


8

मैंने __init__.pyअपने स्रोतों के मूल फ़ोल्डर में शीर्ष-स्तर को हटाकर इसे ठीक किया ।


1
इसे मेरे लिए तय किया। क्या कोई इसे समझा सकता है?
अबोगर

इस अधिकार ने इसे मेरे लिए भी ठीक कर दिया। निश्चित रूप से इसके लिए एक स्पष्टीकरण देखना पसंद करेंगे यदि किसी के पास है
King_wayne

मैं init जोड़ा गया है । लेकिन अभी भी एक ही मुद्दे का सामना कर रहा था, लेकिन यह समाधान मेरे लिए भी काम किया .. कारण कृपया?
अभिजीत

7

मुझे अजीब ConftestImportFailure: ImportError('No module named ...त्रुटियां होने लगीं जब मैंने गलती से __init__.pyफ़ाइल को अपनी src डायरेक्टरी में जोड़ दिया था (जो कि पायथन पैकेज नहीं थी, बस सभी स्रोत का एक कंटेनर था)।


3

मुझे यह त्रुटि कुछ सरल होने के कारण भी मिल रही थी (आप इसे तुच्छ भी कह सकते हैं)। मैंने pytestमॉड्यूल स्थापित नहीं किया था । इसलिए एक साधारण ने apt install python-pytestइसे मेरे लिए तय किया।

'पाइस्टेस्ट' को एक परीक्षण निर्भरता के रूप में setup.py में सूचीबद्ध किया गया होगा। सुनिश्चित करें कि आप परीक्षण आवश्यकताओं को भी स्थापित करते हैं।


3

मेरा मुद्दा भी ऐसा ही था। pytestजिस वातावरण में मैं काम कर रहा था, उसमें स्थापित मॉड्यूल को पहचान नहीं पाया।

मैंने इसे भी pytestउसी वातावरण में स्थापित करके हल किया ।


हालांकि मैं एक वेव के अंदर से पाइस्टेस्ट का उपयोग कर रहा था, लेकिन मैंने इसे विश्व स्तर पर स्थापित किया था जिसने मुझे यह त्रुटि दी। वैश्विक संस्करण को अनइंस्टॉल करने और वेनव के अंदर स्थापित करने के बाद यह काम करता है।
मार्कस रासेल

2

मेरे लिए समस्या निर्देशिका tests.pyके साथ Django द्वारा उत्पन्न की गई थी tests। हटाने tests.pyसमस्या हल हो।


2

मुझे यह त्रुटि मिली क्योंकि मैंने गलत तरीके से रिश्तेदार आयात का उपयोग किया था। OP उदाहरण में, test_app.py जैसे कार्यों का आयात करना चाहिए

from repo.app import *

हालाँकि उदारतापूर्वक __init__.py फाइलें फ़ाइल संरचना के आसपास बिखरी हुई हैं, यह काम नहीं करता है और जब तक फ़ाइलें और परीक्षण फ़ाइलें एक ही निर्देशिका में नहीं होती हैं तब तक इस तरह के ImportError को देखा जाता है।

from app import *

यहाँ एक उदाहरण है कि मुझे अपनी एक परियोजना के साथ क्या करना था:

यहाँ मेरी परियोजना संरचना है:

microbit/
microbit/activity_indicator/activity_indicator.py
microbit/tests/test_activity_indicator.py

Activity_indicator.py को test_activity_indicator.py से एक्सेस करने में सक्षम होने के लिए मुझे आवश्यक है:

  • सही सापेक्ष आयात के साथ test_activity_indicatory.py शुरू करें:
    from microbit.activity_indicator.activity_indicator import *
  • परियोजना संरचना में __init__.py फाइलें डालें:
    microbit/
    microbit/__init__.py
    microbit/activity_indicator/__init__.py
    microbit/activity_indicator/activity_indicator.py
    microbit/tests/__init__.py
    microbit/tests/test_activity_indicator.py

0

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


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

@ Help-info.de से टिप्पणी के अलावा: यहां सवालों के जवाब देने के लिए गाइड का लिंक दिया गया है: stackoverflow.com/help/how-to-answer
NOD

0

डिर्क एवरी द्वारा मीडियम पर एक पोस्ट के अनुसार (और मेरे व्यक्तिगत अनुभव द्वारा समर्थित) यदि आप अपनी परियोजना के लिए एक आभासी वातावरण का उपयोग कर रहे हैं, तो आप सिस्टम-वाइड का उपयोग नहीं कर सकते; आपको इसे वर्चुअल वातावरण में स्थापित करना होगा और उस इंस्टॉल का उपयोग करना होगा।

विशेष रूप से, यदि आपने इसे दोनों स्थानों पर स्थापित किया है, तो बस pytestकमांड चलाना काम नहीं करेगा क्योंकि यह सिस्टम इंस्टॉल का उपयोग करेगा। जैसा कि अन्य उत्तरों में वर्णित है, एक सरल समाधान python -m pytestइसके बजाय चलाने का है pytest; यह काम करता है क्योंकि यह पर्यावरण के संस्करण का उपयोग करता है। वैकल्पिक रूप से, आप सिस्टम के pytest संस्करण को अनइंस्टॉल कर सकते हैं; वर्चुअल वातावरण को पुनः सक्रिय करने के बाद pytestकमांड को काम करना चाहिए।


मेरे लिए अब तक काम करने वाली एक ही चीज थी python -m pytest tests/
निक ओ ललाई

0

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

आपको setup.pyकम से कम निम्नलिखित दो पंक्तियों के साथ अपने प्रोजेक्ट के रूट डायरेक्टरी में एक फाइल बनानी होगी :

from setuptools import setup, find_packages
setup(name="PACKAGENAME", packages=find_packages())

जहां PACKAGENAME आपके ऐप का नाम है। फिर आपको इसे पाइप से स्थापित करना होगा:

pip install -e .

-eझंडा पिप बताता मोड संपादन योग्य में पैकेज इंस्टॉल करने के लिए या "विकसित"। तो अगली बार जब आप pytestइसे चलाते हैं तो मानक में अपना ऐप ढूंढना चाहिए PYTHONPATH


0

मेरा समाधान:

निर्देशिका conftest.pyमें फ़ाइल बनाएँ test:

import os
import sys
sys.path.insert(0,os.path.dirname(os.path.realpath(__file__)) + "/relative/path/to/code/")

यह हर परीक्षण फ़ाइल को संशोधित करने , एनवी चर स्थापित करने या निरपेक्ष / रिश्तेदार रास्तों के साथ गड़बड़ करने के बिना अजगर पथ के लिए ब्याज का फ़ोल्डर जोड़ देगा ।

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