I have a Bottle webserver module with the following line:
from foobar.formtools import auto_process_form_insert And the foobar.formtools module contains this line:
from foobar.webserver import redirect, redirect_back Of course, both result in the following errors (respectively):
ImportError: cannot import name auto_process_form_insert
ImportError: cannot import name redirect
Is it simply a fact that in Python two modules can't import each other and all module imports must be hierarchical in nature, or am I doing something wrong? Alternatively, is there a workaround short of placing all these nice functions in new modules?
Modules can import each other cyclically, but there's a catch. In the simple case, it should work by moving the import statements to the bottom of the file or not using the from syntax.
Modules can import other modules.
As explained in my answer, it is possible for modules to import each other, but if you need to do that, you may want to reconsider your design.
No, files can be imported from different directories.
Modules can import each other cyclically, but there's a catch. In the simple case, it should work by moving the import statements to the bottom of the file or not using the from syntax.
Here's why that works:
When you import a module, Python first checks sys.modules. If it's in there, it just imports from there. If it's not there, it tries to import it in the normal way; basically, it finds the file and runs the stuff in it.
Running a module populates the module's contents. For example, say we have this module, creatively named example_opener:
import webbrowser def open_example(): webbrowser.open('http://www.example.com/') At the start, the module is empty. Then Python executes:
import webbrowser After that, the module only contains webbrowser. Then Python executes this:
def open_example(): webbrowser.open('http://www.example.com/') Python creates open_example. Now the module contains webbrowser and open_example.
Say webbrowser contained this code:
from example_opener import open_example def open(url): print url Say example_opener is imported first. This code is executed:
import webbrowser webbrowser has not yet been imported, so Python executes the contents of webbrowser:
from example_opener import open_example example_opener has been imported, but not yet fully executed. Python doesn't care. Python pulls the module out of sys.modules. At this point, example_opener is still empty. It hasn't defined open_example yet, nor even completed importing webbrowser. Python can't find open_example in example_opener, so it fails.
What if we imported open_example from the end of webbrowser and webbrowser from the end of example_opener? Python would start by executing this code:
def open_example(): webbrowser.open('http://www.example.com/') webbrowser does not exist yet, but it doesn't matter until open_example is called. Now example_opener contains only open_example. It then executes:
import webbrowser It has not been imported yet, so Python executes webbrowser. It starts:
def open(url): print url It defines open. Then it executes:
from example_opener import open_example example_opener is in sys.modules, so it uses that. example_opener contains open_example, so it succeeds. Python finishes importing webbrowser. That concludes importing webbrowser from example_opener. That's the last thing in example_opener, so the import of example_opener finishes, successful, as well.
Don't do from ... import .... Just do import ... and reference its objects using the module name.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With