2012-02-12 12 views
1

私はコードを投稿しません、少し長いので、私は関連する部分だけを引用します。Pythonモジュールインポートの問題

私はいくつかのクラスを定義したメインの.pyファイルを持っています。ファイルを実行し、クラスで定義されたプロシージャを使用すると、すべて正常に動作します。ここでは、すべての定義(「from some_file import *」)を含むファイルをインポートするメインの.pyファイルを作成したいと思います。今、このファイルを実行すると、1つのプロシージャが動作せず、NameError(グローバル名some_attributeが定義されていません)が返されます。今、この手順はクラスの1つで定義され、別のクラスの内部で作成されたアトリビュートを使用します。何らかの理由で、この参照が機能しないと私は間違って何をしているのだろうか。ここでは、私は "メイン"ファイルからコードを与えます:

from fem_obj import * 
nd = Node() 
nd.nodegen(1, 1, 0, 0, 4, 0, 4) 
el = Element() 
el.elgen(1, 1, 1, 2, 1, 1, 3) 

fem_objは私のクラスのノードと要素を持つファイルです。 ndとelはもちろんインスタンスです。 nodegenとelgenはメソッドです。もう一方のファイル内のelgenメソッドは、nodegenプロシージャの呼び出し後に作成される属性を参照します。そして、私は名前のエラーを取得します。つまり、elgenメソッドはnodegenメソッドによって作成されるリストであるnd.nodesを使用します。

これが十分明確であれば、必要に応じて他のファイルのコードを投稿することができます。助けを前にありがとう。

OKは、ここfem_objのためのコードです:

from math import hypot, sqrt 
from Tkinter import * 

class Node: 

    def __init__(self): 
     self.nodes = [] 
     self.nodenum = 0 

    def nodegen(self, slabel, dlabel, sx, sy, dx, dy, num):  
     for i in range(1, num + 1):     
      label = slabel + (i - 1)*dlabel 
      if self.nodecheck(label) == True: 
       return "Node %s already exists!" %label    
      self.nodes = self.nodes + [[label, (sx + (i - 1)*dx, sy + (i - 1)*dy), (0, 0, 0)]] 
      self.nodenum += 1 

    def nodegenf(self, slabel, dlabel, sx, dx, num): 
     f = lambda x: sqrt(1 - x**2) 
     for i in range(1, num + 1):     
      label = slabel + (i - 1)*dlabel 
      if self.nodecheck(label) == True: 
       return "Node %s already exists!" %label    
      self.nodes = self.nodes + [[label, (sx + (i - 1)*dx, f(sx + (i - 1)*dx)), (0, 0, 0)]] 
      self.nodenum += 1  

    def nodeadd(self, label, sx, sy): 
     if self.nodecheck(label) == True: 
      return "Node %s already exists!" %label 
     self.nodes = self.nodes + [[label, (sx, sy), (0, 0, 0)]] 
     self.nodenum += 1   

    def nodedel(self, label): 
     if self.nodecheck(label) == False: 
      return "Node %s does not exist!" %label 
     for i in el.elements: 
      if label in i[1]: 
       return "Node %s attached to element %s!" %(label, i[0]) 
     for i in self.nodes: 
      if label == i[0]: 
       self.nodes.remove(i) 
     self.nodenum -= 1     

    def nodecheck(self, label): 
     for i in self.nodes: 
      if label == i[0]: 
       return True 
     return False 

    def noderes(self, label, u, v, r): 
     if self.nodecheck(label) == False: 
      return "Node %s does not exist!" %label 
     for i in self.nodes: 
      if label == i[0]: 
       i[2] = (u, v, r)  

    def nodelist(self): 
     if self.nodes == []: 
      return "No nodes defined!" 
     print "\n" 
     print "NUMBER OF NODES: ", self.nodenum 
     print "\n" 
     print "NODE COORDINATES RESTRAINTS" 
     print "---- ----------- ----------" 
     print "\n" 
     for i in self.nodes: 
      print i[0], " ", i[1], "  ", i[2] 


class Element: 

    def __init__(self): 
     self.elements = [] 
     self.elnum = 0 

    def elgen(self, slabel, dlabel, snl, enl, sndl, endl, num): 
     for i in range(1, num + 1):     
      label = slabel + (i - 1)*dlabel 
      if self.elcheck(label) == True: 
       return "Element %s already exists!" %label 
      if self.elements != []: 
       for j in self.elements: 
        if j[1] == (snl + (i - 1)*sndl, enl + (i - 1)*endl): 
         return "Element %s endnodes already taken!" %label 
      hlplst = [] 
      for j in nd.nodes: # nd reference 
       hlplst = hlplst + [j[0]] 
      if snl + (i - 1)*sndl not in hlplst: 
       return "Node %s does not exist" %(snl + (i - 1)*sndl) 
      if enl + (i - 1)*endl not in hlplst: 
       return "Node %s does not exist" %(enl + (i - 1)*endl)        
      self.elements = self.elements + [[label, (snl + (i - 1)*sndl, enl + (i - 1)*endl)]] 
      self.elnum +=1 
     self.ellen() 

    def elcheck(self, label): 
     for i in self.elements: 
      if label == i[0]: 
       return True 
     return False 

    def eladd(self, label, snl, enl): 
     if self.elcheck(label) == True: 
      return "Element %s already exists!" %label 
     if self.elements != []: 
      for j in self.elements: 
       if j[1] == (snl, enl):   
        return "Endnodes already taken by element %s!" %j[0] 
     hlplst = [] 
     for j in nd.nodes: # nd reference 
      hlplst = hlplst + [j[0]] 
     if snl not in hlplst: 
      return "Node %s does not exist" %snl 
     if enl not in hlplst: 
      return "Node %s does not exist" %enl 
     self.elements = self.elements + [[label, (snl, enl)]] 
     self.elnum +=1 
     self.ellen() 

    def eldel(self, label): 
     if self.elcheck(label) == False: 
      return "Element %s does not exist!" %label 
     for i in self.elements: 
      if label == i[0]: 
       self.elements.remove(i) 
     self.elnum -=1 

    def ellen(self): 
     if self.elements == []: 
      return "No elements defined!" 
     for i in self.elements: 
      if len(i) == 2: 
       x1 = y1 = x2 = y2 = 0 
       for j in nd.nodes: 
        if i[1][0] == j[0]: 
         x1 = j[1][0] 
         y1 = j[1][1] 
        elif i[1][1] == j[0]: 
         x2 = j[1][0] 
         y2 = j[1][1] 
       i.append(round(hypot(x1 - x2, y1 - y2), 4)) 
      else: 
       continue    

    def ellist(self): 
     if self.elements == []: 
      return "No elements defined!" 
     print "\n" 
     print "NUMBER OF ELEMENTS: ", self.elnum 
     print "\n" 
     print "ELEMENT START NODE END NODE LENGTH SECTION" 
     print "------- ---------- -------- ------ -------" 
     print "\n" 
     for i in self.elements: 
      if len(i) < 4: 
       print i[0], "   ", i[1][0], "   ", i[1][1], "  ", i[2], "  ", "NONE" 
      else: 
       print i[0], "   ", i[1][0], "   ", i[1][1], "  ", i[2], "  ", i[3]     

    def sctassign(self, label, slabel, elabel, dlabel): 
     for i in s1.sections: # s1 reference 
      if label == i[0]: 
       break 
      return "Section %s does not exist!" %label 

     j = 0 
     while slabel + j*dlabel <= elabel: 
      for i in self.elements: 
       if i[0] == slabel + j*dlabel: 
        i.append(label) 
        j += 1 
        continue 
       else: 
        return "Element %e does not exist!" %(slabel + j*dlabel) 

私は問題があるように思われる要素クラス内#nd参照を置きます。申し訳ありませんが、コードは少し長いです...(#nd参照コメントが表示される行はNameErrorラインである)

+0

elgenとnd.nodesの間に接続がありません。 el.elgenはnd.nodesにアクセスするためにndが存在することをどのように知っていましたか?隠されたグローバルな状態がありますか? – DSM

+0

他のファイルのコードは、NameErrorがどこに生成されているかのように聞こえます(少しはっきりしていませんが)。なぜなら、btw、from foo import *はひどい考えです。 – geoffspear

+0

他のファイルのコードを投稿してください。推測を避ける必要があります:) –

答えて

3

たぶん私は、誤解しました。名前の誤差は次のとおりです。

Traceback (most recent call last): 
    File "main.py", line 5, in <module> 
    el.elgen(1, 1, 1, 2, 1, 1, 3) 
    File "/home/snim2/Dropbox/scratch/so/fem_obj.py", line 86, in elgen 
    for j in nd.nodes: # nd reference 
NameError: global name 'nd' is not defined 

とラインこの文脈では86が表示されます:

def elgen(self, slabel, dlabel, snl, enl, sndl, endl, num): 
    for i in range(1, num + 1):     
     label = slabel + (i - 1)*dlabel 
     if self.elcheck(label) == True: 
      return "Element %s already exists!" %label 
     if self.elements != []: 
      for j in self.elements: 
       if j[1] == (snl + (i - 1)*sndl, enl + (i - 1)*endl): 
        return "Element %s endnodes already taken!" %label 
     hlplst = [] 
     for j in nd.nodes: # nd reference 
      hlplst = hlplst + [j[0]] 
     if snl + (i - 1)*sndl not in hlplst: 
      return "Node %s does not exist" %(snl + (i - 1)*sndl) 
     if enl + (i - 1)*endl not in hlplst: 
      return "Node %s does not exist" %(enl + (i - 1)*endl)        
     self.elements = self.elements + [[label, (snl + (i - 1)*sndl, enl + (i - 1)*endl)]] 
     self.elnum +=1 
    self.ellen() 

だから、あなたはelgenNode秒のあなたの配列を使用することができるようにしたい場合は、あなたがにそれらを渡す必要があります

def elgen(self, nd, slabel, dlabel, snl, enl, sndl, endl, num): 
    for i in range(1, num + 1):     
     label = slabel + (i - 1)*dlabel 
     if self.elcheck(label) == True: 
      return "Element %s already exists!" %label 
     if self.elements != []: 
      for j in self.elements: 
       if j[1] == (snl + (i - 1)*sndl, enl + (i - 1)*endl): 
        return "Element %s endnodes already taken!" %label 
     hlplst = [] 
     for j in nd.nodes: # nd reference 
      hlplst = hlplst + [j[0]] 
     if snl + (i - 1)*sndl not in hlplst: 
      return "Node %s does not exist" %(snl + (i - 1)*sndl) 
     if enl + (i - 1)*endl not in hlplst: 
      return "Node %s does not exist" %(enl + (i - 1)*endl)        
     self.elements = self.elements + [[label, (snl + (i - 1)*sndl, enl + (i - 1)*endl)]] 
     self.elnum +=1 
    self.ellen() 

main.pyで:

このような引数としてその方法、
nd = Node() 
nd.nodegen(1, 1, 0, 0, 4, 0, 4) 
el = Element() 
el.elgen(nd, 1, 1, 1, 2, 1, 1, 3) 
+0

コードを編集し、それを使用するプロシージャの引数として "nd"を追加しました。今はうまくいくようです。助けてくれてありがとう。 –

0

私がこれまでのコードが実行されるようになっているすべてのものを把握するためとして行きませんでした、しかし、あなたは問題のある線を持っています...

for j in nd.nodes: # nd reference 

これは変数 "nd"を参照しています。 main.pyを除いて、 "nd"がどこに定義されているかわかりません。 main.pyは見つかりません。

main.py:

from feb_obj import run 
nd = "Test" 
run() 

feb_obj.py:

def run(): 
    print nd # This won't work! 

私はあなたがそれは "ND" を知るために期待していると考えているあなたは、次の誤ったコードにこの問題を簡素化することができます"main.py"ファイルで定義されている変数です。これはPythonの仕組みではありません。 "fem_obj.py"は、自身のスコープ内で定義されているものだけを表示します。 "hypot"と "sqrt"は、それらをインポートしたためにどのようなものかを知っています。しかし、main.pyファイルを含む他のモジュールの変数についてはわかりません。これはまっすぐ進むと思われるので

+0

さて、ndはNodesクラスの内部で定義されています。メインモジュールでは、これが私が参照している部分の前で実行されます。これは私にとってはまだ少し混乱しています。メインモジュールはそれを見ることができないので、この変数がどの名前空間であるかはわかりません。明らかにfem_objモジュールにあります。 –