Ошибка импорта переменной из другого файла - PullRequest
0 голосов
/ 09 ноября 2018

Я создаю программу, которая использует очень большую переменную, поэтому я даю ей собственный файл. При попытке импортировать переменную я получаю ошибки.

скажем, 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 import file2, может ли это быть причиной проблемы?

РЕДАКТИРОВАТЬ 2: В ответ на Майка, на реальный код ссылаются, однако я не хотел использовать реальный код, потому что я думаю, что сброс 300 строк кода здесь будет осужден. Я изменил свой пример, чтобы отразить ваше предложение.

РЕДАКТИРОВАТЬ 3: Я поместил файл __init__.py в папку безрезультатно.

РЕДАКТИРОВАТЬ 4: в ответ на комментарий Майка. Хорошая точка зрения. Извините, я не предоставил достаточно информации, я пытался включить только необходимую информацию, но, очевидно, я пропустил довольно много. В следующий раз я обязательно предоставлю лучший контекст.

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Изменение:

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

0 голосов
/ 09 ноября 2018

То, что вы описываете, должно работать. Вот рабочий пример:

+
- 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']

Распространенные причины ошибок атрибутов, связанных с ошибками импорта:

  • Конфликты имен (например, у вас есть папка и файл с тем же именем, и импортируется неправильное)

  • Круговой импорт (файл1 импортирует файл2, но файл2 также импортирует файл1)

Чтобы устранить это, вы можете попробовать:

# 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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...