2012-04-20 11 views
89

मैं पर एक मैक easy_install स्थापित करने के लिए इस्तेमाल किया pytest और इतने पसंद करती है एक फ़ाइल संरचना के साथ एक परियोजना के लिए परीक्षण लिखना शुरू किया: थोड़ी देर मेंपथ मुद्दा pytest साथ 'ImportError: नहीं मॉड्यूल नामित YadaYadaYada'

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

रन py.test रेपो निर्देशिका, सबकुछ व्यवहार करता है जैसा कि आप

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

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

+1

[यहाँ] (http://docs.pytest.org/en/latest/goodpractices.html#integrating-with-setuptools-python-setup-py -टेस्ट-पायस्टेस्ट-धावक) setuptools के साथ इसे ठीक करने का तरीका है। – ederag

उत्तर

49

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

ए। पथ फ़ाइलों को मैन्युअल रूप से पथ में जोड़ें, जैसे कुछ:

import sys, os 
myPath = os.path.dirname(os.path.abspath(__file__)) 
sys.path.insert(0, myPath + '/../') 

बी। env var PYTHONPATH=../ के साथ परीक्षण चलाएं।

+5

जब मैं निर्देशिका में 'cd'ing कर रहा हूं? मैं अपनी जड़ से 'py.test' चला रहा हूँ। जब तक कि मैं गलत नहीं हूं और आपका मतलब है कि मेरे फ़ोल्डर्स – MattoTodd

+0

के माध्यम से पाइस्टेस्ट चलता है, यदि यह 'सीडी' मुद्दा था, तो क्या मैं इसे मैक पर भी नहीं मारूंगा? – MattoTodd

+0

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

62

मुझे एक ही समस्या थी। मैंने इसे फ़ाइल को tests निर्देशिका में खाली करके इसे ठीक किया।

+47

ध्यान दें कि यह * नहीं * py.test द्वारा अनुशंसित है: अपनी परीक्षण निर्देशिका में फ़ाइलों को __init__.py से बचें। इस प्रकार आपके परीक्षण आसानी से स्थापित पैकेज से, mypkg के स्थापित संस्करण के खिलाफ आसानी से चल सकते हैं यदि इसमें परीक्षण शामिल हैं या नहीं। 'एसआरसी: http://pytest.org/latest/goodpractises.html –

+13

मैं यहां उसी के साथ आया था प्रश्न और पाया गया कि मेरी परीक्षण निर्देशिका से '__init __। py' को हटाकर मेरे लिए हल किया गया। – 101

+2

@ के.-माइकलएई आप परीक्षणों में एक पैकेज नहीं है, तो आप अपने परीक्षणों में मॉड्यूल कैसे आयात करना चाहते हैं ?? – mafrosis

27

आप

PYTHONPATH=. py.test 

परियोजना जड़ में PYTHONPATH साथ चला सकते हैं या पिप स्थापित उपयोग के रूप में संपादित आयात

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

यह 'test' निर्देशिका संरचना में नहीं' 'test' निर्देशिका संरचना में नहीं है और 'test' और' src' निर्देशिका दोनों वाली निर्देशिका से कॉल करने के लिए मेरे लिए काम नहीं करता है। – Zelphir

99

मुझे यकीन है कि नहीं कर रहा हूँ क्यों py.test में वर्तमान निर्देशिका नहीं जोड़ता है

python -m pytest tests/ 

यह: PYTHONPATH ही, लेकिन यहाँ एक समाधान (अपने भंडार की जड़ से निष्पादित करने के लिए) है काम करता है क्योंकि पायथन आपके लिए PythonPATH में वर्तमान निर्देशिका जोड़ता है।

+1

यह एक सुंदर साफ कामकाज है, उदा। स्क्रिप्ट और मॉड्यूल का परीक्षण करने के लिए जो पैकेज/इंस्टॉल करने योग्य नहीं हैं! – Christoph

+1

इसे रिश्तेदार आयात को पूर्ण लोगों को फिर से लिखना होगा, यदि आपके पास उस स्तर पर एप्लिकेशन चलाने के लिए कोड नहीं है, जहां से आप आदेश निष्पादित करते हैं। उदाहरण के लिए: 'प्रोजेक्ट/टेस्ट/ऑल-माय-टेस्ट' और 'प्रोजेक्ट/src/app.py' और उस परिवर्तन के कारण, किसी को '___main __। Py' फ़ाइल का उपयोग करके अप्रत्यक्ष रूप से' app.py' को कॉल करने की आवश्यकता है 'प्रोजेक्ट/src', ताकि कोई कॉल 'पायथन -एम src' का उपयोग कर सके। जहां तक ​​मैं कह सकता हूं, बहुत गन्दा सामान। – Zelphir

+2

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

13

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

https://github.com/jeffmacdonald/pytest_test

विशेष रूप से: आप जहां भी शामिल कर रहे मॉड्यूल को खोजने के लिए py.test और tox बताने के लिए की है।

PYTHONPATH=. py.test 

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

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

क्या आप जिस परियोजना से जुड़े हैं, उसके लिए आप एक संक्षिप्त स्पष्टीकरण दे सकते हैं? –

+1

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

+3

हालांकि यह सख्ती से जरूरी नहीं है, यह उत्तर में उत्तर की मुख्य सामग्री रखने की एक सामान्य नीति है क्योंकि यह सुनिश्चित करता है कि उत्तर अब से एक्स वर्षों में समझ में आता है जब लिंक संसाधन लंबे समय तक चलाया जा सकता है। –

2

मैं हो रही अजीब "ConftestImportFailure शुरू कर दिया:

आप ऐसा कर सकते py.test साथ

ImportError ('नहीं मॉड्यूल नाम दिया गया ... "त्रुटियों जब मैंने गलती से __init__.py फ़ाइल को मेरी स्रोत निर्देशिका में जोड़ा था (जिसे पाइथन पैकेज नहीं माना गया था, केवल सभी स्रोतों का एक कंटेनर था)

1

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

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

2

भागो pytest के साथ ही एक मॉड्यूल के रूप: python -m pytest tests

संबंधित मुद्दे