包导入和NameError

时间:2014-10-15 12:35:09

标签: python python-2.7 namespaces python-import

我在输入自制模块时遇到了一些麻烦,我只是看不出我做错了什么。

我有一个名为basics的包,它包含我的所有基类 我有一个名为components的第二个包,组件中的每个模块都使用基础模块。 我有一个脚本文件,位于另一个文件夹中,该文件调用基础和组件模块。

我收到以下错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Anaconda\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 540, in runfile
    execfile(filename, namespace)
  File "H:/scripts/CIF_utilities/scripts/hello world.py", line 11, in <module>
    TW=TextWriter(r'H:/scripts/CIF_utilities/components')
  File "H:\scripts\CIF_utilities\components\textwriter.py", line 23, in __init__
    layout=Layout(File=os.path.join(path,'alphabet.CIF'))
NameError: global name 'Layout' is not defined

我的脚本是:hello world.py

#hello world.py
import basics
from components.textwriter import *

TW=TextWriter(r'H:/scripts/CIF_utilities/components')

cell=TW.writeText('Hello World',30e3)
cell.draw()

layout=Layout()
layout.addCell(cell)
layout.workCell=cell

layout.exportCIF('hello world',os.getcwd())

textwriter.py是给出错误的那个。在 init 中,我使用Layout类从预先格式化的文件加载一些数据(将导入) 在textwriter.py中

#texwriter.py
import basics
import os, os.path, sys
import re
from numpy import *
from scipy import *


class TextWriter:

    def __init__(self,pathToCIF=None):
        if pathToCIF==None:
            path=os.path.split(textwriter.__file__)[0]
        else:
            path=pathToCIF            

        ###line that crashes is here        

        layout=Layout(File=os.path.join(path,'alphabet.CIF'))
        self.alphabet=layout.workCell

有layout.py类:

#layout.py
import basics
from numpy import *
from scipy import *
import Tkinter
import tkFileDialog
import os, os.path
import re
import datetime

class Layout:
    countCell=0
    @classmethod
    def getNewNumber(self):
        Layout.countCell+=1
        return Layout.countCell


    def __init__(self,File=None):
        self.cellList=[]
        self.layerList=[]
        self.nameFile=""
        self.comments=""
        self.workCell=None

        if File!=None:
            self.importCIF(File)

基础包的 init .py包含所有必要的输入:

#__init__.py in basics folder
from baseElt import *
from cell import *
from layout import *
from transformation import *
来自组件的 init .py为空

我目前正在使用anaconda 64bits发行版(如果我记得好的话,则是python 2.7)

感谢您的急需!

2 个答案:

答案 0 :(得分:1)

Layout导入basics/__init__.py后,它仅存在于basics命名空间中,而不存在于helloworld.py中。使用

访问它
layout = basics.Layout()

或使用

Layout明确导入helloworld.py
from basics import Layout

答案 1 :(得分:0)

在textwriter.py中,您要切换

layout=Layout(File=os.path.join(path,'alphabet.CIF'))

layout=basics.Layout(File=os.path.join(path,'alphabet.CIF'))

您的代码可能遇到类似的问题。值得注意的是,使用

并不是pythonic
from package import *

建议改为使用

from package_or_module import specific_item
import package_or_module

请记住,如果您使用常规import导入,则必须使用模块/包名称来访问所需的对象(即basics.Layout)。