I\'m banging my head against the wall with some basic Python importing. I have simplified the problem as much as possible hoping I\'d be able to expand this to a larger scal
You encountered No module named 'file2'
because you run run.py
outside a package, when file1
import file2
, python cannot find file2
as the module directory not in module search path.
For your scenario, file1
& file2
are 2 modules which in the same package, for this situation, suggest you use relative import
, this is the best practice.
from .file2 import B
class A(object):
pass
Then, python run.py
works.
As you mentioned you will see next if execute python p1/run.py
:
attempted relative import with no known parent package
What does it mean?
This because relative import
can just be supported in the module which in package.
You may say file1.py
is in package p1
, why still see the error?
This is because python use __name__
to determine if this module in package or not, not by the position of it.
Change file1.py
as follows:
print(__name__)
from .file2 import B
class A(object):
pass
Next is the output:
p1.file1
file1
For python p1/run.py
, because it runs in the package, python will fail to know it is in a package, so output is file1
.
If __name__
does not has .
, python will think it's not in package, so relative import failure.
python p1/run.py
, e.g. unittest your package?Use python -m p1.run
, this should works to execute top script which inside a package.