【问题标题】:package import and NameError包导入和 NameError
【发布时间】:2014-10-15 12:35:09
【问题描述】:

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

我有一个名为 basics 的包,其中包含我所有的基类 我有第二个名为 components 的包,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 64 位发行版(如果我没记错的话是 python 2.7)

感谢您急需的帮助!

【问题讨论】:

  • 不应该是basics.Layout(...)(或from basics import Layout)吗?
  • 我将“import basics”更改为“from basics import *”,现在可以了!我会用一些更高级的脚本再试一次,看看它是否也适用

标签: python python-2.7 namespaces python-import


【解决方案1】:

由于Layout是在basics/__init__.py中导入的,所以它只存在于basics命名空间中,而不存在于helloworld.py中。要么访问它

layout = basics.Layout()

或显式将Layout 导入helloworld.py

from basics import Layout

【讨论】:

    【解决方案2】:

    在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)。

    【讨论】:

      猜你喜欢
      • 2021-08-01
      • 2012-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多