2016-01-25 5 views
9

मैं एक पायथन स्क्रिप्ट करने की कोशिश कर रहा हूं जिसे इसे एकाधिक फ़ाइलों में विभाजित किया गया है, इसलिए मैं इसे बहुत लंबे समय तक फ़ाइल स्क्रिप्ट बनाने के बजाय इसे अधिक आसानी से बनाए रख सकता हूं ।पायथन आयात त्रुटि: 'मॉड्यूल' ऑब्जेक्ट में कोई विशेषता नहीं है 'x'

यहाँ निर्देशिका संरचना है:

wmlxgettext.py 
<pywmlx> 
    |- __init__.py 
    |- (some other .py files) 
    |- <state> 
     |- __init__.py 
     |- state.py 
     |- machine.py 
     |- lua_idle.py 

अगर मैं अपने प्रोजेक्ट (जहां wmlxgettext.py स्क्रिप्ट संग्रहीत किया जाता है) के मुख्य निर्देशिका तक पहुँचने और अगर मैं करने के लिए "आयात pywmlx" प्रयास करते समय मुझे आयात त्रुटि है (गुण त्रुटि: 'मॉड्यूल' ऑब्जेक्ट कोई विशेषता 'राज्य' है):

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/home/user/programmi/my/python/wmlxgettext/true/pywmlx/__init__.py", line 9, in <module> 
    import pywmlx.state as statemachine 
    File "/home/user/programmi/my/python/wmlxgettext/true/pywmlx/state/__init__.py", line 1, in <module> 
    from pywmlx.state.machine import setup 
    File "/home/user/programmi/my/python/wmlxgettext/true/pywmlx/state/machine.py", line 2, in <module> 
    from pywmlx.state.lua_idle import setup_luastates 
    File "/home/user/programmi/my/python/wmlxgettext/true/pywmlx/state/lua_idle.py", line 3, in <module> 
    import pywmlx.state.machine as statemachine 
AttributeError: 'module' object has no attribute 'state' 

जब से मैं "परियोजना मुख्य निर्देशिका" pywmlx में हूँ होना चाहिए

यहाँ पूरा त्रुटि संदेश है PYTHONPATH पर (वास्तव में जब मुझे pywmlx/something.py आयात करने का प्रयास किया गया तो मुझे कोई परेशानी नहीं है)

मैं यह नहीं समझ पा रहा हूं कि मेरी त्रुटि कहां है और इस समस्या को हल करने के लिए कैसे।

# all following imports works well: 
from pywmlx.wmlerr import ansi_setEnabled 
from pywmlx.wmlerr import wmlerr 
from pywmlx.wmlerr import wmlwarn 
from pywmlx.postring import PoCommentedString 
from pywmlx.postring import WmlNodeSentence 
from pywmlx.postring import WmlNode 

# this is the import that does not work: 
import pywmlx.state as statemachine 

यहाँ pywmlx/राज्य/__ init__.py स्रोत है:

यहाँ pywmlx/__ init__.py स्रोत है

from pywmlx.state.machine import setup 
from pywmlx.state.machine import run 

लेकिन मुझे लगता है कि असली पीईएमएमएलएक्स/राज्य निर्देशिका में संग्रहीत एक (या सभी) पायथन मॉड्यूल द्वारा उपयोग किए जाने वाले "आयात" में समस्या कुछ हद तक छिपी हुई है।

# State is a "virtual" class 
from pywmlx.state.state import State 
from pywmlx.state.lua_idle import setup_luastates 
import pywmlx.nodemanip as nodemanip 

def addstate(self, name, value): 
    # code is not important for this question 
    pass 

def setup(): 
    setup_luastates() 

def run(self, *, filebuf, fileref, fileno, startstate, waitwml=True): 
    # to do 
    pass 

अंत में यहाँ pywmlx/राज्य/lua_idle.py स्रोत है:

यहाँ pywmlx/राज्य/machine.py स्रोत है

import re 
import pywmlx.state.machine as statemachine 
# State is a "virtual" class 
from pywmlx.state.state import State 

# every state is a subclass of State 
# all proprieties were defined originally on the base State class: 
    # self.regex and self.iffail were "None" 
    # the body of "run" function was only "pass" 
class LuaIdleState (State): 
    def __init__(self): 
     self.regex = re.compile(r'--.*?\s*#textdomain\s+(\S+)', re.I) 
     self.iffail = 'lua_checkpo' 

    def run(xline, match): 
     statemachine._currentdomain = match.group(1) 
     xline = None 
     return (xline, 'lua_idle') 


def setup_luastates(): 
    statemachine.addstate('lua_idle', LuaIdleState) 

क्षमा करें यदि मैं इतने सारे कोड और इतनी सारी फाइलें पोस्ट की गईं ... लेकिन मुझे डर है कि निर्देशिका में, फाइलें एक ही आयात समस्या से अधिक छुपाती हैं, इसलिए मैंने उन सभी को प्रकाशित किया, उम्मीद करते हुए कि मैं भ्रम से बचने में समस्या को समझा सकता हूं।

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


खोजों डन:

Not Useful: मैं पहले से ही स्पष्ट रूप से आयात x.y. उपयोग कर रहा हूँz हर समय मैं कुछ आयात करने के लिए

Not Useful जरूरत है: जहाँ तक मुझे पता है, pywmlx: प्रश्न आयात संबंधी त्रुटियों के बारे में पूछता है यहां तक ​​कि अगर, यह के रूप में (1)

इसी कारण

Not Useful के लिए उपयोगी नहीं लगती है मेरे परीक्षणों पर "वर्तमान कार्यशील निर्देशिका" के बाद से PYTHONPATH में स्थित होना चाहिए वह निर्देशिका है जिसमें मुख्य पायथन स्क्रिप्ट और pywmlx निर्देशिका शामिल है। मुझे सही अगर मैं जब संकुल का आयात गलत

+0

क्या आप समस्याग्रस्त आयात को 'से बदलकर बदल सकते हैं। राज्य को राज्यमाचिन के रूप में आयात करें? –

+0

क्या आपने पहले खाली __init__ फ़ाइलों के साथ प्रयास किया है? यदि यह काम करता है तो एलियासिंग (आयात के रूप में) का उपयोग न करने का प्रयास करें क्योंकि इससे नामस्थान संघर्ष हो सकता है। मुझे लगता है कि आप गड़बड़ नामस्थान के साथ परिपत्र आयात कर रहे हैं। हमेशा पूर्ण नाम का उपयोग करने का प्रयास करें (केवल आयात लिखें ..., आयात से नहीं)। – Serbitar

+0

@Serbitar: मैं अपनी टिप्पणी "वोट" के लिए, क्योंकि अपने सुझाव बहुत अच्छी तरह से काम करता है चाहते हैं। __pywmlx/राज्य पर केवल __import pywmlx.state.machine__ साथ statemachine__ रूप __import pywmlx.state.machine की जगह/lua_idle.py__ बहुत अच्छी तरह से (काम करता है शायद, pywmlx.state.machine aliasing statemachine __pywmlx/\ द्वारा प्रयोग किया जाता अलियासिंग के साथ एक संघर्ष पैदा रूप में _ \ _ init \ _ \ _ py__ जहां __pywmlx.state__ एलियास किया गया __statemachine__ भी मैं अपनी टिप्पणी पर सकारात्मक वोट चिह्नित करने के लिए पता नहीं कैसे के रूप में:।।/मैं इसे – Nobun

उत्तर

9

अजगर कई बातें करता हूँ:

  • पैकेज के लिए sys.modules में एक वस्तु बनाने के लिए, कुंजी के रूप में नाम के साथ: 'pywmlx', 'pywmlx.state', 'pywmlx.state.machine', आदि
  • उस मॉड्यूल के लिए लोड बाइटकोड चलाएं; यह अधिक मॉड्यूल बना सकता है।
  • एक बार मॉड्यूल पूरी तरह से लोड हो जाने पर और यह किसी अन्य पैकेज के अंदर स्थित होता है, मॉड्यूल को मूल मॉड्यूल ऑब्जेक्ट की विशेषता के रूप में सेट करें। इस प्रकार sys.modules['pywmlx.state'] मॉड्यूल विशेषता sys.modules['pywmlx'] मॉड्यूल ऑब्जेक्ट पर विशेषता के रूप में सेट किया गया है।

कि अंतिम चरण नहीं अपने उदाहरण में अभी तक हुआ है, लेकिन निम्न पंक्ति ही काम करता है जब यह स्थापित किया गया है:

import pywmlx.state.machine as statemachine 

क्योंकि यह दोनों state और machine ऊपर लग रहा है के रूप में पहली जिम्मेदार बताते हैं। बजाय इस वाक्य रचना का उपयोग करें:

from pywmlx.state import machine as statemachine 

वैकल्पिक रूप से, सिर्फ

import pywmlx.state.machine 

का उपयोग करें और pywmlx.state.machine. साथ अन्य सभी स्थानों statemachine. बदलें। यह काम करता है क्योंकि आपके नामस्थान में जो भी जोड़ा गया है वह sys.modules['pywmlx'] मॉड्यूल ऑब्जेक्ट का संदर्भ है और जब तक आप कार्यों और विधियों में उस संदर्भ का उपयोग नहीं करते हैं तब तक विशेषता संदर्भों को हल करने की आवश्यकता नहीं होगी।

+0

आपके उत्तर के लिए बहुत बहुत धन्यवाद।मुझे यकीन नहीं है कि मैं आपकी सभी व्याख्याओं को समझ गया हूं, लेकिन मैंने उस जटिल काम की सराहना की जब आपने जटिल तरीके से ऐसी जटिल चीज (आयात करने के तरीके को गहराई से समझने) की व्याख्या करने की कोशिश की। मैंने __lua_idle.py__ पर उपयोग किए गए __import__ से उपनाम को हटाने के बाद भी आपके समाधान का प्रयास नहीं किया है (जो शायद अच्छी तरह से काम करेगा) और यह एक ऐसा समाधान है जो मैं फिट बैठता हूं जो मैं pywmlx द्वारा उपयोग किए गए नामस्थानों के साथ प्रबंधित करने की कोशिश कर रहा हूं :) – Nobun

+0

@ नोबुन: निश्चित रूप से, यह भी काम करता है; मैंने जवाब के विकल्प को जोड़ा है। –

+0

'वह अंतिम चरण अभी तक आपके उदाहरण में नहीं हुआ है' ऐसा क्यों लगता है? – ecoe

2

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

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

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