从另一个文件导入变量时出错

时间:2018-11-09 15:52:35

标签: python arrays python-3.x tkinter

我正在构建一个使用非常大的变量的程序,因此我为其提供了自己的文件。尝试导入变量时,我总是收到错误消息。

假设file1有我的代码,file2有变量,我的file2看起来像这样:

array = [[0,0,0],[0,0,0],[0,0,0]]

和我的file1看起来像这样:

import tkinter
import file2
class test:
    def print_var():
        print(file2.array)
test().print_var()

每当我运行它时,它就会告诉我'module' object does not have attribute 'array'。我尝试将其放在班级中并导入该班级,但这也不起作用。感觉好像我缺少重要的东西,任何帮助将不胜感激。

如果重要:变量是数组,文件位于同一文件夹,并且项目正在使用tkinter。

编辑:该项目包含3个文件:main文件,变量文件(file2)和导入到file1中的mainmain文件和file1都导入file2,这可能引起问题吗?

编辑2:响应Mike,引用了实际的代码,但是我不想使用实际的代码,因为我认为将300行代码转储到这里会被拒绝。我已更改示例以反映您的建议。

编辑3:我将__init__.py文件放入文件夹无济于事。

编辑4:针对Mike的评论。好点子。抱歉,我没有提供足够的信息,我尝试仅包含必要的信息,但显然我错过了很多。下次我一定会提供更好的上下文。

2 个答案:

答案 0 :(得分:0)

您所描述的应该起作用。 这是一个工作示例:

+
- file1.py
- file2.py


#file1.py
array = ['x', 'y']

#file2.py
import file1
print(file1.array)
# this also works
from file1 import array
print(array)


# Bash
❯❯❯ python file2.py
['x', 'y']
['x', 'y']

与导入错误相关的属性错误的常见原因:

  • 名称冲突(例如,您有一个文件夹和一个具有相同名称的文件,并且导入了错误的名称)

  • 循环导入(file1导入file2,但file2也导入file1)

要解决此问题,您可以尝试:

# Ensure correct file is being imported
>>> print(file2.__file__)
'~/dev/file2.pyc'

# Check the variables in the imported module's scope - note 'array' is listed
>>> dir(file2)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'array']
  • 请确保没有循环导入-如果涉及__init__.py,则必须格外小心,因为使用父文件夹时,其中的代码将运行。这可能导致代码比您想象的更早导入

关于循环进口的说明

如果我在上面的工作代码示例中包含循环导入, 注意,我得到的错误与您完全相同:

#file1.py
import file2  # Circular Import
array = ['x', 'y']

#file2.py
import file1
print(dir(file1))
print(file1.array)

# Bash - Note unlike example above, "array" is not included
# in the module's scope due to the circular import
❯❯❯ python file2.py
['__builtins__', '__doc__', '__file__', '__name__', '__package__']
Traceback (most recent call last):
...
AttributeError: 'module' object has no attribute 'array'

答案 1 :(得分:0)

更改:

def print_var():

收件人:

def print_var(self):

更新:

此外,如果您在文件路径中使用软件包,则可能需要加上软件包名称。例如,我使用的是Eclipse ID,如果我使用软件包存储所有文件,则需要对导入执行类似的操作。

import PackageName.file2 as file2

class test:
    def print_var(self):
        print(file2.array)

test().print_var()

如果您不这样做,将会遇到类似的错误。

AttributeError: module 'file2' has no attribute 'array'

当您有一个类并且想要在该类内部调用一个函数时,您需要将该函数定义为一个类方法,以便可以从该类外部访问该函数。

通过将self添加到函数中,它成为一个类方法,现在可以使用以下方法调用:

test().print_var()

请注意,您的示例不包含对测试类的调用,因此我假设您要么完全丢失了此调用,要么在示例中忘记了该调用。无论哪种方式,您都将需要它。

根据您的问题,我构建了2个文件。

file1.py:

import file2

class test:
    def print_var(self):
        print(file2.array)

test().print_var()

file2.py:

array = [[0,0,0],[0,0,0],[0,0,0]]

结果:

enter image description here