Here’s the structure I’m working with:
directory/
script.py
subdir/
__init__.py
myclass01.py
myclass02.py
What I want to do is import in script.py the classes defined in myclass01.py and myclass02.py. If I do:
from subdir.myclass01 import *
It works fine for the class defined in myclass01.py. But with this solution if there are many classes defined in different files in subdir and I want to import all of them, I’d have to type one line for each file. There must be a shortcut for this. I tried:
from subdir.* import *
But it didn’t work out.
EDIT: here are the contents of the files:
This is __init__.py (using __all__ as Apalala suggested):
__all__ = ['MyClass01','MyClass02']
This is myclass01.py:
class MyClass01:
def printsomething():
print 'hey'
This is myclass02.py:
class MyClass02:
def printsomething():
print 'sup'
This is script.py:
from subdir import *
MyClass01().printsomething()
MyClass02().printsomething()
This is the traceback that I get when I try to run script.py:
File "script.py", line 1, in <module>
from subdir import *
AttributeError: 'module' object has no attribute 'MyClass01'
Although the names used there are different from what’s shown in your question’s directory structure, you could use my answer to the question titled Namespacing and classes. The
__init__.pyshown there would have also allowed theusepackage.pyscript to have been written this way (packagemaps tosubdirin your question, andClass1tomyclass01, etc):Revision (updated):
Oops, sorry, the code in my other answer doesn’t quite do what you want — it only automatically imports the names of any package submodules. To make it also import the named attributes from each submodule requires a few more lines of code. Here’s a modified version of the package’s
__init__.pyfile (which also works in Python 3.4.1):Alternatively you can put the above into a separate .py module file of its own in the package directory—such as
_import_package_files.py—and use it from the package’s__init__.pylike this:Whatever you name the file, it should be something that starts with an
_underscore character so it doesn’t try toimportitself recursively.