我正在构建一个使用非常大的变量的程序,因此我为其提供了自己的文件。尝试导入变量时,我总是收到错误消息。
假设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
中的main
。 main
文件和file1
都导入file2
,这可能引起问题吗?
编辑2:响应Mike,引用了实际的代码,但是我不想使用实际的代码,因为我认为将300行代码转储到这里会被拒绝。我已更改示例以反映您的建议。
编辑3:我将__init__.py
文件放入文件夹无济于事。
编辑4:针对Mike的评论。好点子。抱歉,我没有提供足够的信息,我尝试仅包含必要的信息,但显然我错过了很多。下次我一定会提供更好的上下文。
答案 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]]
结果: