2017-01-25 3 views
-1

Im пытается понять, как я могу получить доступ и увеличить число, которое находится внутри другого скрипта. Моя иерархия выглядит так:Приращение целого числа из другого скрипта

- TestDirectory 
-- foo.py 
-- bar.py 

Пример:

foo.py

import TestDirectory.bar as bar 
def main(): 
    testCounter = 0 
    bar.increment() 
    print(testCounter) 

main() 

bar.py

import TestDirectory.foo as foo 
def increment(): 
    foo.main().testCounter += 1 

Я ожидал, что мою печать, чтобы вернуть 1, но он дает мне ошибку:

AttributeError: module 'TestDirectory' has no attribute 'bar' 

Может кто-нибудь объяснить или решить мою проблему?

+1

Это не будет работать. Но проблема, с которой вы сталкиваетесь, - это циклический импорт, который я думаю. –

+0

Помимо проблемы с циклическим импортом, я не могу воспроизвести эту ошибку. Я получаю модуль ImportError: No с именем «TestDirectory», когда я пытаюсь запустить его извне «TestDirectory». –

+0

Но есть ли у вас идея, как подойти к такой проблеме? – Anonymous

ответ

0

Проводка мое решение, чтобы помочь кому-то в ней нуждается!

иерархия, как это (Даже если это не имеет значения):

- Folder1 
-- bar.py 
- Folder2 
-- foo.py 

Решение:

foo.py

from Folder1 import bar 
def main(): 
    bar.increment() 
    print(bar.counter) 

main() 

бар. py

counter = 0 
def increment(): 
    global counter 
    counter += 1 
1

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

Простой способ обойти циклические проблемы в вашем случае выглядит следующим образом:

  • В bar.py, изменить поведение функции increment принять int в качестве параметра ввода и возврата после его обновления.
  • В foo.py, обновите main, чтобы отправить testCounter в качестве аргумента и получить его возвращаемое значение.
  • Устранить оператор импорта в foo.py (в зависимости от вашего соглашения) при удалении циклического импорта в bar.py.

Вот минималистские изменения кода, которые я сделал для сортировки этой проблемы.
P.S: Запуск изнутри папки TestDirectory.

foo.py

import bar 

def main(): 
    testCounter = 0 
    testCounter = bar.increment(testCounter) 
    print(testCounter) 

main() 

bar.py

def increment(testCounter): 
    testCounter += 1 
    return testCounter 
0

Много проблем с вашим кодом:

  1. Переменные в методах являются локальными для метода, вы не можете получить к ним доступ извне функции, fo rget вне скрипта (т. е.модуль)
  2. Для импорта другого модуля в той же папке, просто использовать имя самого сценария
  3. Поскольку вы хотите получить доступ к foo от bar и bar от foo, вы в конечном итоге с циклическим импорта, который можно избежать с местный импорт

Вот решение вашей проблемы, но, скорее всего, вы будете делать лучше с изменением дизайна, вместо того, что я "м размещения:

foo.py

import bar 

testCounter=0 

if __name__=="__main__": 
    bar.incrementTestCounter() 
    print bar.getTestCounterValue() 

bar.py

def incrementTestCounter(): 
    import foo 
    foo.testCounter=foo.testCounter+1 

def getTestCounterValue(): 
    import foo 
    return foo.testCounter 
Смежные вопросы