Как получить переменную из другого файла python

Обновлено: 06.07.2024

Однако я не могу заставить file2 распознавать переменные из file1, даже если он уже импортирован в file1. Было бы чрезвычайно полезно, если это возможно каким-либо образом.

Импорт file2 в file1.py глобальные (то есть, на уровне модуля) имена, связанные в file2 , доступные для следующего кода в file1 - единственное такое имя - SomeClass . Он не делает наоборот: имена, определенные в file1 , не доступны для кода в file2 , когда file1 импортирует file2 . Это было бы так, даже если вы импортировали правильный путь ( import file2 , как правильно рекомендует @nate), а не ужасным, ужасным способом вы делаете это (если бы все под солнцем забыли само существование конструкции from . import * , жизнь была бы такой намного лучше для всех).

Очевидно, вы хотите сделать глобальные имена, определенные в file1 , доступными для кода в file2 и и наоборот. Это известно как «циклическая зависимость» и является ужасной идеей (в Python или где-либо еще в этом отношении).

Итак, вместо того, чтобы показывать вам невероятно хрупкие, часто не поддерживаемые хаки для достижения (некоторого подобия) циклической зависимости в Python, я бы скорее обсудил множество отличных способов, которыми вы можете избегать такая ужасная структура.

Например, вы можете поместить глобальные имена, которые должны быть доступны обоим модулям, в третий модуль (например, file3.py , чтобы продолжить серию имен ;-) и импортировать третий модуль в каждый из двух других ( import file3 в обоих ---- +: = 15 =: + ---- и file1 , а затем используйте file2 и т. Д., То есть квалифицированные имена, с целью доступа к этим глобальным именам или установки их из одного или обоих другие модули, не голые имена).

Конечно, может быть предложена все более конкретная помощь, если вы уточнили (отредактировав свой Q) именно то, почему вы считаете, что вам нужна циклическая зависимость (всего лишь один простой прогноз: независимо от того, что вас заставляет думаю, что вам нужна циклическая зависимость, вы ошибаетесь; -).

Когда вы пишете

фактически копирует имена, определенные в file2 , в пространство имен file1 . Так что если вы переназначаете эти имена в file1 , написав

например, это будет сделано только в file1 , а не в file2 . Обратите внимание, что если вы хотите изменить атрибут на foo , скажем, выполните

тогда это изменение будет отражено в file2 , потому что вы изменяете существующий объект, на который ссылается имя foo , не заменяя его новым объектом.

Вы можете получить желаемый эффект, выполнив это в file1.py :

(обратите внимание, что вам следует удалить from foo import * ), хотя я бы посоветовал тщательно подумать, действительно ли вам это нужно делать. Нечасто, что изменение переменных одного модуля из другого модуля действительно оправдано.

Все, что вы сделали, является правильным, за исключением случаев использования переменных.

В файле main_file.py:

(или)

Используйте следующий заголовок:

Замените все ссылки на флаг и j (или любую другую переменную, которую вы хотите использовать из этого файла) с префиксом "переменные".

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

Вы можете использовать

а затем получить доступ к vairables следующим образом:

или вы можете использовать:

а затем доступ к vaiables только по их имени.

Внимание!

Обратите внимание, что во втором случае вы будете работать с копией переменных, а их изменение в одном модуле не влияет на переменные в другом модуле!

Вам нужно импортировать переменные из файла. Вы можете импортировать все из них следующим образом:

Или ссылайтесь на переменную из импортированного модуля, например, variables.flag

Или импортируйте их один за другим, как этот

Лучше всего использовать variables.flag сохранение пространства имен variables , потому что, когда ваш код становится большим, вы всегда можете знать, что переменная флага поступает из переменных модуля. Это также позволит вам использовать один и тот же флаг имен переменных в других модулях, например module2.flag

Вариант 1: import сохранение пространства имен

Это предпочтительнее, если у вас много таких flag и j из разных модулей, и вы не хотите, чтобы интерпретатор путался между каждой версией.

Вариант 2: import в ваше пространство имен

Работает, когда вы уверены, что у вас не будет конфликтов имен. Я рекомендую from . import . . from . import * , потому что в первом случае вы знаете, что вы импортируете. В последнем случае есть вероятность, что вы можете импортировать объект, который перезаписывает существующий объект из другого модуля с тем же именем, что вызывает проблемы.

Читайте также: