2017-01-25 5 views
-1

Ich versuche zu verstehen, wie ich auf eine Ganzzahl zugreifen und sie erhöhen kann, die sich in einem anderen Skript befindet. Mein Hierachie ist wie folgt:Ganzzahl von anderem Skript inkrementieren

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

Beispiel:

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 

erwartete ich meinen Druck 1 zurückzukehren, aber es gibt mir eine Fehlermeldung:

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

Kann jemand erklären, oder mein Problem lösen?

+1

Dies wird sowieso nicht funktionieren. Aber das Problem, dem Sie gegenüberstehen, sind zyklische Importe, denke ich. –

+0

Abgesehen von dem Problem mit zyklischen Importen kann ich diesen Fehler nicht reproduzieren. Ich erhalte einen ImportError: Kein Modul mit dem Namen TestDirectory, wenn ich versuche, es von außerhalb des TestDirectory auszuführen. –

+0

Aber haben Sie eine Idee, wie Sie einem solchen Problem begegnen? – Anonymous

Antwort

0

Posting meine Lösung alle anderen in Not zu helfen!

Hierachie ist wie folgt (Auch wenn es sollte keine Rolle spielen):

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

Lösung:

foo.py

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

main() 

bar. py

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

Obwohl ich Ihren Fehler nicht reproduzieren kann (und es spielt keine Rolle), scheint es, dass Sie hier bei zyklischen Importen durcheinander kommen.

Eine einfache Möglichkeit, zyklische Probleme in Ihrem Fall zu umgehen, ist wie folgt:

  • In bar.py, das Verhalten von increment Funktion ändern Sie ein int als Eingangsparameter zu übernehmen und zurück, nachdem es zu aktualisieren.
  • In foo.py, aktualisieren Sie main, um testCounter als Argument zu senden und seinen Rückgabewert abzufangen.
  • Korrigieren Sie die Importanweisung in foo.py (abhängig von Ihrer Konvention), während Sie den zyklischen Import in bar.py entfernen.

Hier sind die minimalistischen Codeänderungen, die ich vorgenommen habe, um dieses Problem zu sortieren.
S.: Aus dem Ordner TestDirectory heraus laufen.

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

Viele Probleme mit Ihrem Code:

  1. Variablen in Methoden sind auf das Verfahren vor Ort, Sie können nicht von außerhalb der Funktion darauf zugreifen außerhalb des Skripts (d. h.Modul)
  2. Um ein weiteres Modul im selben Ordner zu importieren, nur den Namen des Skripts verwenden, selbst
  3. Da Sie foo von bar und bar von foo zugreifen möchten, können Sie mit einem zyklischen Import am Ende, die mit vermieden werden können lokale Importe

Hier ist eine Lösung für Ihr Problem, aber die Chancen sind, werden Sie besser machen mit einer Designänderung statt, was ich "m Angebot:

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 
Verwandte Themen