Global Variable from a different file Python
So I have two different files somewhat like this:
file1.py
from file2 import *
foo = "bar"
test = SomeClass()
file2.py
class SomeClass :
def __init__ (self):
global foo
print foo
However I cannot seem to get file2 to recognize variables from file1 even though its imported into file1 already. It would be extremely helpful if this is possible in some way.
Importing file2
in file1.py
makes the global (i.e., module level) names bound in file2
available to following code in file1
-- the only such name is SomeClass
. It does not do the reverse: names defined in file1
are not made available to code in file2
when file1
imports file2
. This would be the case even if you imported the right way (import file2
, as @nate correctly recommends) rather than in the horrible, horrible way you're doing it (if everybody under the Sun forgot the very existence of the construct from ... import *
, life would be so much better for everybody).
Apparently you want to make global names defined in file1
available to code in file2
and vice versa. This is known as a "cyclical dependency" and is a terrible idea (in Python, or anywhere else for that matter).
So, rather than showing you the incredibly fragile, often unmaintainable hacks to achieve (some semblance of) a cyclical dependency in Python, I'd much rather discuss the many excellent way in which you can avoid such terrible structure.
For example, you could put global names that need to be available to both modules in a third module (e.g. file3.py
, to continue your naming streak;-) and import that third module into each of the other two (import file3
in both file1
and file2
, and then use file3.foo
etc, that is, qualified names, for the purpose of accessing or setting those global names from either or both of the other modules, not barenames).
Of course, more and more specific help could be offered if you clarified (by editing your Q) exactly why you think you need a cyclical dependency (just one easy prediction: no matter what makes you think you need a cyclical dependency, you're wrong;-).
When you write
from file2 import *
it actually copies the names defined in file2
into the namespace of file1
. So if you reassign those names in file1
, by writing
foo = "bar"
for example, it will only make that change in file1
, not file2
. Note that if you were to change an attribute of foo
, say by doing
foo.blah = "bar"
then that change would be reflected in file2
, because you are modifying the existing object referred to by the name foo
, not replacing it with a new object.
You can get the effect you want by doing this in file1.py
:
import file2
file2.foo = "bar"
test = SomeClass()
(note that you should delete from foo import *
) although I would suggest thinking carefully about whether you really need to do this. It's not very common that changing one module's variables from within another module is really justified.