python: Two modules and classes with the same name under different packages
Solution 1
You want to import the User
modules in the package __init__.py
files to make them available as attributes.
So in both Helper/__init_.py
and Controller/__init__.py
add:
from . import User
This makes the module an attribute of the package and you can now refer to it as such.
Alternatively, you'd have to import the modules themselves in full:
import ShutterDeck.Controller.User
import ShutterDeck.Helper.User
u1=ShutterDeck.Controller.User.User()
u2=ShutterDeck.Helper.User.User()
so refer to them with their full names.
Another option is to rename the imported name with as
:
from ShutterDeck.Controller import User as ControllerUser
from ShutterDeck.Helper import User as HelperUser
u1 = ControllerUser.User()
u2 = HelperUser.User()
Solution 2
One way is just:
import ShutterDeck.Controller.User
import ShutterDeck.Helper.User
cuser = ShutterDeck.Controller.User.User()
huser = ShutterDeck.Helper.User.User()
You can also do this:
from ShutterDeck.Controller.User import User as ControllerUser
from ShutterDeck.Helper.User import User as HelperUser
Solution 3
This might also help (struggled with similar problem today):
ShutterDeck
├── Controller
│ ├── __init__.py
│ └── User.py
├── Helper
│ ├── __init__.py
│ └── User.py
└── __init__.py
in ShutterDeck/{Controller,Helper}/__init__.py
:
from .User import User
And then:
>>> import ShutterDeck.Helper
>>> helperUser = ShutterDeck.Helper.User()
>>> helperUser
<ShutterDeck.Helper.User.User object at 0x1669b90>
>>> import ShutterDeck.Controller
>>> controllerUser = ShutterDeck.Controller.User()
>>> controllerUser
<ShutterDeck.Controller.User.User object at 0x1669c90>
Related videos on Youtube
Mayank
Updated on February 05, 2020Comments
-
Mayank about 4 years
I have started to learn python and writing a practice app. The directory structure looks like
src | --ShutterDeck | --Helper | --User.py -> class User --Controller | --User.py -> class User
The
src
directory is inPYTHONPATH
. In a different file, lets saymain.py
, I want to access bothUser
classes. How can I do it.I tried using the following but it fails:
import cherrypy from ShutterDeck.Controller import User from ShutterDeck.Helper import User class Root: @cherrypy.expose def index(self): return 'Hello World' u1=User.User() u2=User.User()
That's certainly ambiguous. The other (c++ way of doing it) way that I can think of is
import cherrypy from ShutterDeck import Controller from ShutterDeck import Helper class Root: @cherrypy.expose def index(self): return 'Hello World' u1=Controller.User.User() u2=Helper.User.User()
But when above script is run, it gives the following error
u1=Controller.User.User() AttributeError: 'module' object has no attribute 'User'
I'm not able to figure out why is it erroring out? The directories
ShutterDeck
,Helper
andController
have__init__.py
in them.