How do relative imports work? - python

I have a directory structure like this
project/
__init__.py
greetings.py
script.py
greetings.py
def hello():
print('Hello')
script.py
from . import greetings
greetings.hello()
When I execute python script.py following error occurs
Traceback (most recent call last):
File "script.py", line 1, in <module>
from . import greetings
ImportError: cannot import name 'greetings'
If I just use import greetings in script.py everything works.
But why does the relative import give error?
And why does it work when I use from . import models in views while working in django.

Please follow Module vs Package concept in python.
Here you created a package so you have to import package as:-
from project import greetings

Here relative import will work as
from .greetings import *
OR
import greetings
greetings should be on same folder

Related

ModuleNotFoundError when import from constants file in python

app-main-folder
/local
/__init__.py
/run.py
constants.py
I am trying to import from constants in run.py it's throwing this error
Traceback (most recent call last):
File "local/run.py", line 4, in <module>
from init import app
File "/home/manavarthivenkat/ANUESERVICES--BACKEND/local/init.py", line 5, in <module>
from constants import BaseConstants
ModuleNotFoundError: No module named 'constants'
pip install constants
Try this on your shell
and try running run.py
make sure you load the constants library
this is because Python assumes all your python files are in the current directory. you should tell the compiler you are looking for the file somewhere else.
from app-main-folder.constants import constants # assuming constants is the name of your class in that constants.py
You can use sys.path.append to tell Python interpreter where to search the modules.
First, you can check the current Python path
import sys
from pprint import pprint
pprint(sys.path)
If the path to the directory of constants.py is not included in the output, you can manually add that path, by
import sys
sys.path.append("/path/to/constants.py")

ImportError and ModuleNotFoundError: how to get a script running from the command line?

I have a project with the following structure:
HorticulturalSalesPrediction/
Docker
HorticulturalSalesPrediction_API/
optimization/
__init__.py
optuna_optim.py
preprocess/
__init__.py
base_dataset.py
utils/
__init__.py
FeatureAdder.py
helper_functions.py
__init__.py
optim_pipeline.py
run.py
In the script run.py I import stuff like this:
import optim_pipeline
from utils import helper_functions
And in the script optim_pipeline.py I import stuff like this:
from utils import helper_functions
from preprocess import base_dataset
from optimization import optuna_optim
I developed this framework with the IDE PyCharm and when I run it with the 'Run'-Button, the framework works fine. But when I want to run it over a terminal with python3 run.py or python3 -m run.py, I get the following error:
Traceback (most recent call last):
File "run.py", line 3, in <module>
import optim_pipeline
File "/home/josef/Schreibtisch/HorticulturalSalesPrediction/HorticulturalSalesPrediction/HorticulturalSalesPrediction_API/optim_pipeline.py", line 4, in <module>
from preprocess import base_dataset
File "/home/josef/Schreibtisch/HorticulturalSalesPrediction/HorticulturalSalesPrediction/HorticulturalSalesPrediction_API/preprocess/base_dataset.py", line 8, in <module>
from HorticulturalSalesPrediction_API.utils import FeatureAdder
ModuleNotFoundError: No module named 'HorticulturalSalesPrediction_API'
I know that there are already tons of questions and solutions to this whole python import topic (Relative imports - ModuleNotFoundError: No module named x, Call a function from another file?, Relative imports for the billionth time, ...), but none of these worked for me.
When I print sys.path I among others receive '/home/josef/Schreibtisch/HorticulturalSalesPrediction/HorticulturalSalesPrediction/HorticulturalSalesPrediction_API', so all this stuff should be available at the syspath.
I also tried to do relative and absolute imports. But with these attempts I reveice ValueError: attempted relative import beyond top-level package or ImportError: attempted relative import with no known parent package errors (e.g. when I try from . import optim_pipeline).
Try reinstalling the modules and updating python.
Update HorticulturalSalesPrediction_API
So I found my mistake.
The solution is to run python3 -m HorticulturalSalesPrediction_API.run in the HorticulturalSalesPrediction folder.
Then it works like expected.
I just then had to adjust some imports:
from HorticulturalSalesPrediction_API.utils import helper_functions
from . import optim_pipeline
and
from HorticulturalSalesPrediction_API.utils import helper_functions
from HorticulturalSalesPrediction_API.preprocess import base_dataset
from HorticulturalSalesPrediction_API.optimization import optuna_optim

Python import file from the same directory: ModuleNotFoundError: No module named

I have the following files. And I want to be able to run python web\file1.py in Mod1.
Mod1
web
__init__.py
file1.py
file2.py
__init__.py
and in file1.py:
import web.file2
However, when I run the following command in the directory mod1:
....\Mod1> python .\web\file1.py
Traceback (most recent call last):
File ".\web\file1.py", line 1, in <module>
import web.file2
ModuleNotFoundError: No module named 'web'
I tried to change the content of file1.py to
from . import file2
and the error become
ImportError: attempted relative import with no known parent package
As I understood what You want, You want to have file2.py imported in file1.py
If that is correct, all You need to do is type this in file1.py
import file2
Happy Coding!
It seem you are trying to import web/file1.
Since there is an init file at mod1, you should use this in Mod1
import .web.file1 as f1
Then this in file2
import .file1 as f1

change in import in python3

I am using python 3.4.4 and testing "init.py" feature by creating a sample package But unable to implement. The mentioned case is working perfectly in case of python 2.7.13 version. Can anyone tell me the mistake i am doing or is there any change in syntax of python 3.x versions. Please help me to learn Python 3?
Dir Structure:
TestPackage/
__init__.py
TestModule.py
run.py
Content of TestModule.py :
def TestFun():
print("Welcome")
Content of __init__.py :
from TestModule import TestFun
Content of run.py :
from TestPackage import TestFun
TestFun()
When i execute run.py file, i got the following error:
Traceback (most recent call last):
File "D:\CASE03\run01.py", line 1, in <module>
from TestPackage import TestFun
File "D:\CASE03\TestPackage\__init__.py", line 1, in <module>
from TestModule import TestFun
ImportError: No module named 'TestModule'
But when i use python 2.7.13 it works perfectly fine. Please guide me.
Inside of __init__.py, if you change
from TestModule import TestFun
to
from .TestModule import TestFun
You'll get the expected behavior.
See: PEP 328 (sections regarding relative imports using leading dots).
Try changing the __init__.py to the below code:
from TestPak.TestModule import TestFun
The simplest solution is to set __init__.py as a blank file. In case you are interested in controlling what gets imported from your module when you do from Testmodule import *, you can include __all__ = ['TestFun'] in __init__.py file.

cannot find module in another directory

I have the project structure:
/hdfs-archiver
/logs
/qe
__init__.py
/tests
__init__.py
archiver.py
/utils
__init__.py
HdfsConnector.py
I am trying to run archiver.py but I am getting this error:
Traceback (most recent call last):
File "qe/tests/HdfsArchiver.py", line 8, in <module>
from qe.utils import HdfsConnector
ImportError: No module named qe.utils
I read around and it seemed like most people that come across this issue fixed it with __init__.py
when I pwd:
$ pwd
/Users/bli1/Development/QE/idea/hdfs-archiver
my PYTHONPATH in .bashrc
export PYTHONPATH=$PYTHONPATH:/Users/bli1/Development/QE/idea/hdfs-archiver
I also tried having my PYTHONPATH as
/Users/bli1/Development/QE/idea/hdfs-archiver/qe
You're trying to import HdfsConnector as a function or class. Include the HdfsConnector module as part of your absolute import:
from qe.utils.HdfsConnector import my_function
You can also import the module:
import qe.utils.HdfsConnector
# or
import qe.utils.HdfsConnector as HdfsConnector
Firstly, you could try a relative import such as
from ..utils import HdfsConnector
You'd also need to run the script as a module and not as a simple python script due to the __name__ being different. This wouldn't require you to modify the path.
You can find more info here.

Categories