简体   繁体   English

Python模块导入问题

[英]Python module importing issue

I won't post the code, I'll only quote relevant parts, since it's a bit long. 我不会发布代码,我只会引用相关部分,因为它有点长。

So, I have a main .py file where I defined some classes. 因此,我有一个主要的.py文件,其中定义了一些类。 When I run the file and use the procedures defined in the classes, everything works fine. 当我运行文件并使用类中定义的过程时,一切正常。 Now, I want to create a main .py file which will import the file with all the definitions, ie "from some_file import *". 现在,我想创建一个主.py文件,它将导入具有所有定义的文件,即“ from some_file import *”。 Now, when I execute this file, one procedure doesn't work and gives the NameError (global name some_attribute is not defined). 现在,当我执行此文件时,一个过程将不起作用,并给出NameError(未定义全局名称some_attribute)。 Now, this procedure is defined in one of the classes, and uses an attibute created inside another of the classes. 现在,此过程在一个类中定义,并使用在另一个类中创建的角色。 For some reason, this reference doesn't work and I wonder what I'm doing wrong. 由于某种原因,此参考无效,我想知道自己在做错什么。 Here, I'll give the code from the "main" file: 在这里,我将提供“ main”文件中的代码:

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 is the file with my classes Node and Element. fem_obj是包含我的类Node和Element的文件。 nd and el are of course their instances. nd和el当然是它们的实例。 nodegen and elgen are methods. nodegen和elgen是方法。 Now, the elgen method inside the other file refers to an attribute which is created after the nodegen procedure is called. 现在,另一个文件中的elgen方法引用了一个属性,该属性是在调用nodegen过程之后创建的。 And there i get a name error. 然后我得到一个名称错误。 Ie, the elgen method uses nd.nodes, which is a list which is created by the nodegen method. 即,elgen方法使用nd.nodes,这是由nodegen方法创建的列表。

I hope this is clear enough, I can post the code of the other file if necessary. 我希望这很清楚,如有必要,我可以发布另一个文件的代码。 Thanks in advance for any help. 在此先感谢您的帮助。

OK, here's the code for fem_obj: 好的,这是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)

I put #nd reference inside the Element class where there seems to be a problem. 我将#nd引用放在Element类中,那里似乎有问题。 Sorry, the code's a bit long...(the line where the #nd reference comment appears is the NameError line) 抱歉,代码有点长...(#nd参考注释出现的行是NameError行)

Maybe I've misunderstood, because this seems straight forward. 也许我误会了,因为这似乎很简单。 The name error is: 名称错误是:

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

and line 86 appears in this context: 在此上下文中出现第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()

So, if you want elgen to be able to use your array of Node s, you need to pass them into that method as an argument, like this: 因此,如果您希望elgen能够使用Node数组,则需要将它们作为参数传递给该方法,如下所示:

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()

and in main.py : 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)

I didn't go so far as to figure out everything that the code is supposed to be doing, however, you have the troubled line... 我并没有去弄清楚代码应该做的所有事情,但是,您遇到了麻烦……

for j in nd.nodes: # nd reference

which refers to a variable "nd". 指变量“ nd”。 I don't see where "nd" is defined, except in main.py . 除了在main.py中 ,我看不到“ nd”的定义位置 main.py is not going to be found. main.py将找不到。 You can simplify this problem into the following errant code: 您可以将此问题简化为以下错误代码:

main.py: main.py:

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

feb_obj.py: feb_obj.py:

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

I believe you're expecting it to know that "nd" is the variable defined in the "main.py" file. 我相信您期望它知道“ nd”是“ main.py”文件中定义的变量。 This is not how python works. 这不是python的工作原理。 "fem_obj.py" will only see what is defined within it's own scope. “fem_obj.py”只会看到它自己的范围内定义的内容。 It knows what "hypot" and "sqrt" are because you imported them. 它知道什么是“ hypot”和“ sqrt”,因为您已导入它们。 However, it does not know about variables in other modules, including the main.py file. 但是,它不知道其他模块(包括main.py文件)中的变量。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM