दिलचस्प पोस्ट
प्रत्येक 5 सेकंड में AJAX jQuery ताज़ा डीएवी PHP 5.4 के रूप में "गूंज" कम टैग स्थायी रूप से सक्षम क्यों हैं? नेविगेशन के लिए विभाजक जावास्क्रिप्ट के साथ एक ऑरेंज से ऑब्जेक्ट कैसे निकालूँ? # <RSpec :: कोर :: उदाहरण समूह :: नेस्टेड_1: 0x00000106db51f8> के लिए अपरिभाषित विधि `पाने ' Windows एक्सटेंशन के लिए पायथन को स्थापित करने की कोशिश में त्रुटि त्रुटि सी ++ मल्टीचैरैक्टर शाब्दिक कोणीय एचटीटीपी समझौता: `सफलता` /` त्रुटि` पद्धतियों और `फिर` के तर्कों में अंतर Asp.net 5 में विंडोज प्रमाणीकरण PowerShell और ऑपरेटर ऑपरेटर PHP 7 MongoDB क्लाइंट / ड्रायवर स्थापित करना? दशमलव चिह्न परिवर्तित करें मुझे स्पष्ट रूप से सामान्य पैरामीटर प्रकार क्यों प्रदान करना चाहिए जबकि कंपाइलर को इस प्रकार का अनुमान करना चाहिए? स्मार्ट पॉइंटर्स (बूस्ट) ने समझाया URL से होस्ट डोमेन प्राप्त करें?

ठीक करने के लिए कैसे "__init__.py" के साथ भी "गैर-पैकेज में सापेक्ष आयात का प्रयास किया"

मैं निम्नलिखित निर्देशिका संरचना के साथ पीईपी 328 का पालन करने की कोशिश कर रहा हूं:

pkg/ __init__.py components/ core.py __init__.py tests/ core_test.py __init__.py 

core_test.py मेरे पास निम्न आयात स्टेटमेंट है I

 from ..components.core import GameLoopEvents 

हालांकि, जब मैं चलाता हूं, तो मुझे निम्न त्रुटि मिलती है:

 tests$ python core_test.py Traceback (most recent call last): File "core_test.py", line 3, in <module> from ..components.core import GameLoopEvents ValueError: Attempted relative import in non-package 

चारों ओर खोजते हुए मैंने पाया " रिश्तेदार पथ __init__.py " और " एक सापेक्ष पथ से एक मॉड्यूल आयात करें " के साथ भी काम नहीं कर रहा है, लेकिन उन्होंने मदद नहीं की।

क्या मुझे कुछ याद आ रही है?

वेब के समाधान से एकत्रित समाधान "ठीक करने के लिए कैसे "__init__.py" के साथ भी "गैर-पैकेज में सापेक्ष आयात का प्रयास किया""

हाँ। आप इसे पैकेज के रूप में उपयोग नहीं कर रहे हैं

 python -m pkg.tests.core_test 

@ इग्नासियो के जवाब पर विस्तार करने के लिए:

अजगर आयात तंत्र वर्तमान फ़ाइल के __name__ के सापेक्ष काम करता है। जब आप किसी फ़ाइल को सीधे निष्पादित करते हैं, तो इसका अपना सामान्य नाम नहीं होता है, लेकिन उसका नाम "__main__" बजाय उसका नाम है तो रिश्तेदार आयात काम नहीं करते

Igancio सुझाव के रूप में, आप इसे -m विकल्प का उपयोग कर निष्पादित कर सकते हैं। यदि आपके पास आपके पैकेज का एक हिस्सा है जिसका अर्थ स्क्रिप्ट के रूप में चलाया जाता है, तो आप उस फ़ाइल को यह बताने के लिए भी __package__ विशेषता का उपयोग कर सकते हैं कि वह पैकेज पदानुक्रम में क्या नाम है।

विवरण के लिए देखें : http://www.python.org/dev/peps/pep-0366/

यदि आप मौजूदा निर्देशिका को sys.path से sys.path हैं तो आप import components.core सीधे उपयोग कर सकते हैं।

 if __name__ == '__main__' and __package__ is None: from os import sys, path sys.path.append(path.dirname(path.dirname(path.abspath(__file__)))) 

यह इस बात पर निर्भर करता है कि आप अपनी स्क्रिप्ट को कैसे लॉन्च करना चाहते हैं।

यदि आप अपने यूनिटटस्ट को कमांड लाइन से क्लासिक तरीके से लॉन्च करना चाहते हैं, तो यह है:

 python tests/core_test.py 

उसके बाद, इस मामले में 'घटकों' और 'परीक्षण' भाई-बहनों के फ़ोल्डर्स हैं, इसलिए आप सम्मिलित या sys.path मॉड्यूल के ऐपेंड विधि का उपयोग करके संबंधित मॉड्यूल को आयात कर सकते हैं। कुछ इस तरह:

 import sys from os import path sys.path.append( path.dirname( path.dirname( path.abspath(__file__) ) ) ) from components.core import GameLoopEvents 

अन्यथा, आप अपनी स्क्रिप्ट को '-एम' तर्क के साथ लॉन्च कर सकते हैं (ध्यान दें कि इस मामले में, हम एक पैकेज के बारे में बात कर रहे हैं, और इस प्रकार आपको '.py' एक्सटेंशन नहीं देना चाहिए), जो है:

 python -m pkg.tests.core_test 

ऐसे मामले में, आप सापेक्ष आयात का उपयोग बस आप कर सकते हैं:

 from ..components.core import GameLoopEvents 

आप अंततः दो तरीकों को मिला सकते हैं, ताकि आपकी स्क्रिप्ट काम करे, इसके बावजूद इसे कैसे कहा जाए। उदाहरण के लिए:

 if __name__ == '__main__': if __package__ is None: import sys from os import path sys.path.append( path.dirname( path.dirname( path.abspath(__file__) ) ) ) from components.core import GameLoopEvents else: from ..components.core import GameLoopEvents 

यदि आपका उपयोग केस परीक्षण चलाने के लिए है, और यह तेजी है कि यह है, तो आप निम्न कार्य कर सकते हैं। python core_test.py रूप में अपनी परीक्षा स्क्रिप्ट चलाने के बजाय python core_test.py एक परीक्षण ढांचे का उपयोग करें जैसे pytest फिर कमांड लाइन पर आप दर्ज कर सकते हैं

 $$ py.test 

यह आपकी निर्देशिका में परीक्षण चलाएगा यह __name__ के मुद्दे के आसपास हो जाता है __main__ कि @ बर्न बर्न द्वारा सूचित किया गया था इसके बाद, अपनी परीक्षण निर्देशिका में एक खाली __init__.py फ़ाइल डालें, यह आपके पैकेज का परीक्षण निर्देशिका हिस्सा बना देगा। तब आप ऐसा करने में सक्षम होंगे

 from ..components.core import GameLoopEvents 

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

Core_test.py में, निम्नलिखित करें:

 import sys sys.path.append('../components') from core import GameLoopEvents 

डायरेक्टरी को पथ में जोड़ने के लिए मेरा त्वरित-तय है:

 import sys sys.path.insert(0, '../components/')