I am having a huge trouble trying to understand Python 3 imports (I'm using Python 3.5). This seems to be a million-dollar question and I know it has been answered everywhere. However I don't manage to really get a good understanding of how things are supposed to be done; answers on the Internet vary a lot. So sorry in advance if this is a nearly duplicate answer. I would really appreciate references to good reading material.
So I have the following dummy project:
/my_project/main.py
/my_project/lib/__init__.py
/my project/lib/my_lib.py
If possible, I would like to:
python3 main.py
, having my_project
as current working directory.PYTHONPATH
at any time.main.py
contains:
from .lib.my_lib import foo
if __name__ == '__main__':
foo()
And foo
is accordingly defined in lib/my_lib.py
With that configuration, I get:
SystemError: Parent module '' not loaded, cannot perform relative import
I can get around the error by importing like:
from lib.my_lib import foo
But then 1) this is not a Python3 absolute import, right? 2) Pylint complains: Unable to import 'lib.my_lib' (import-error)
The next thing I tried is to add a my_project/__init__.py
, and import like this:
from my_project.lib.my_lib import foo
In this case pylint is happy but then I cannot run as: python3 main.py
:
ImportError: No module named 'my_project'
Then the only way I can run it is from the parent directory as a module: python3 -m my_project.main
.
So my question is: is it possible at all to do the imports in a correct way, while still being able to execute it as python3 main.py
?
Thanks a lot!
I would do something like:
/path/README
/path/requirements.txt
/path/cleverappname/__main__.py
/path/cleverappname/__init__.py
/path/cleverappname/foo.py
/path/cleverappname/bar.py
Assuming you have something like class CleverName(object)
in __init__.py
and things like class Foo(object)
in foo.py
(same for bar, you got the idea).
In __main__
:
from cleverappname import CleverName
from cleverappname.foo import Foo
from cleverappname.bar import Bar
But, it needs you to use it as a python and not a script (which is right, because that's what it is): python3 -m clevername
Pylint seems happy about that.
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