How to fix "ImportError: No module named ..." - python

I have reviewed most of the similar question here.
I'm new to python and I'm using Ubuntu 13.10
The project structure is
├── projecttest
│   ├── api.py
│   ├── controller
│   │   ├── controller.py
│   │   ├── controller.pyc
│   │   ├── init_db.py
│   │   ├── __init__.py
│   │   ├── __init__.pyc
│   │   ├── settings.py
│   │   ├── settings.pyc
│   │   └── extra
│   │   ├── extra.py
│   │   ├── extra.pyc
│   │   ├── __init__.py
│   │   └── __init__.pyc
│   ├── __init__.py
│   ├── lib
│   │   └── __init__.py
│   ├── models
│   │   ├── documents.py
│   │   ├── documents.pyc
│   │   └── __init__.py
All the __init__.py files are empty (no hidden characters) and when I'm trying
$ python init_db.py
that has:
from projecttest.models.documents import *
I'm getting:
Traceback (most recent call last):
File "controllers/init_db.py", line 1, in <module>
from projecttest.models.documents import *
ImportError: No module named projecttest.models.documents

You need to specify PYTHONPATH environment variable, it augments the default search path for module files.
It helps to think about PYTHONPATH as an absolute path. If you specify it you may import modules within your program relative to PYTHONPATH.
In your case it would be something like the following line:
PYTHONPATH=/<dir>/<folder>/projecttest/ python init_db.py
Then you may import modules without problems like:
from models.documents import *

Related

moduleNotFoundError: no module named (*)

 I'm trying to run my tests using python -m pytest but I get an error that
ModuleNotFoundError: No module named 'sample'
When using nosetests or anything else it works fine, but when trying to use pytest, it doesn't work.
My tree looks like below, do you have any advice why it doesn't work?
├── LICENSE.txt
├── README.md
├── data
│   └── data_file
├── exported_register.csv
├── pyproject.toml
├── requirements.txt
├── setup.cfg
├── setup.py
├── src
│   └── sample
│   ├── __init__.py
│   ├── __pycache__
│   │   ├── __init__.cpython-39.pyc
│   │   ├── dziennik.cpython-39.pyc
│   │   ├── przedmiot.cpython-39.pyc
│   │   ├── simple.cpython-39.pyc
│   │   └── uczen.cpython-39.pyc
│   ├── dziennik.py
│   ├── package_data.dat
│   ├── przedmiot.py
│   ├── simple.py
│   └── uczen.py
├── tests
│   ├── __init__.py
│   ├── __pycache__
│   │   ├── __init__.cpython-39.pyc
│   │   ├── test_ASSERTPY_uczen.cpython-39-pytest-6.2.1.pyc
│   │   ├── test_ASSERTPY_uczen.cpython-39-pytest-6.2.5.pyc
│   │   ├── test_ASSERTPY_uczen.cpython-39.pyc
│   │   ├── test_PYHAMCREST_uczen.cpython-39-pytest-6.2.1.pyc
│   │   ├── test_PYHAMCREST_uczen.cpython-39-pytest-6.2.5.pyc
│   │   ├── test_PYHAMCREST_uczen.cpython-39.pyc
│   │   ├── test_UNITTEST_register.cpython-39-pytest-6.2.1.pyc
│   │   ├── test_UNITTEST_register.cpython-39-pytest-6.2.5.pyc
│   │   ├── test_UNITTEST_register.cpython-39.pyc
│   │   ├── test_UNITTEST_uczen.cpython-39-pytest-6.2.1.pyc
│   │   ├── test_UNITTEST_uczen.cpython-39-pytest-6.2.5.pyc
│   │   ├── test_UNITTEST_uczen.cpython-39.pyc
│   │   ├── test_simple.cpython-39-pytest-6.2.1.pyc
│   │   ├── test_simple.cpython-39-pytest-6.2.5.pyc
│   │   └── test_simple.cpython-39.pyc
│   ├── test_ASSERTPY_uczen.py
│   ├── test_PYHAMCREST_uczen.py
│   ├── test_UNITTEST_register.py
│   ├── test_UNITTEST_uczen.py
│   └── test_simple.py
└── tox.ini
When you run pytest with python -m pytest it uses the current directory as it its working dir, which doesn't contain the sample module (located inside ./src). The way I deal with this is I have a conftest.py inside my tests directory where I add my source dir to python path something like this:
import sys
from pathlib import Path
source_path = Path(__file__).parents[1].joinpath("src").resolve()
sys.path.append(str(source_path))
I've recently started using pytorch and have had similar problems. Couple steps come to mind:
How are you writing the .py file that contains the tests? It may simply be that you need to change up how you import sample within the unit test file. I would expect that you need something like import src.sample.simple. In other words, could be just a pathing issue.
Try a (much) simpler folder structure and try again. If that doesn't work, try to just copy an example of a simple scheme that someone has posted. That is, just get python -m pytest to run somehow, then start slowly adding the complexities of your project.

Importing multiple files as a single module?

I have been chasing my tail for the last 4 hours here and can't find the solution.
I have the following module/package structure for my project.
.
├── app-cli.py
├── tools
│   ├── __init__.py
│   ├── adapters
│   │   ├── __init__.py
│   │   ├── cli.py
│   │   ├── web.py
│   ├── utils
│   │   ├── __init__.py
│   │   ├── core.py
│ │   │   ├── my_public_method()
│   │   ├── io.py
│ │   │   ├── some_other_public_method()
What I'm trying to do is bundle everything inside utils within the utils name space.
So when I do import tools at the main level, I can access the util functions as:
tools.utils.my_public_method()
tools.utils.some_other_public_method()
Instead of:
tools.utils.core.my_public_method()
tools.utils.io.some_other_public_method()
I have been editing the __init__.py messing around with the levels of imports, attempting to create a shortcut but with no success.
In your __init__.py inside the utils package you can add
from .core import my_public_method
from .io import some_other_public_method
and then you can do:
import tools.utils
tools.utils.my_public_method()
tools.utils.some_other_public_method()

PyCharm autocomplete is not displaying the methods and classes

I am learning how to create packages in python and as a part of that exercise I set up the __init__.py files in the submodules. I have a folder structure that looks like the following
├── parent_folder
│   ├── README.txt
│   ├── __init__.py
│   ├── base_estimator.py
│   ├── child_folder_1
│   │   ├── __init__.py
│   │   ├── __pycache__
│   │   │   ├── __init__.cpython-36.pyc
│   │   │   ├── naming_constants.cpython-36.pyc
│   │   │   └── value_constants.cpython-36.pyc
│   │   ├── naming_constants.py
│   │   └── value_constants.py
│   ├── child_folder_2
│   │   ├── __init__.py
│   │   ├── __pycache__
│   │   │   ├── __init__.cpython-36.pyc
│   │   │   └── base.cpython-36.pyc
│   │   ├── adult.csv
│   │   ├── axis_fi_nan_treated.csv
│   │   ├── bank_additional_full.csv
│   │   ├── base.py
│   │   ├── boston_house_prices.csv
│   │   ├── breast_cancer.csv
The package is the parent_folder and child_folder_1, child_folder_2 are the sub modules in it
The __init__.py file in the parent_folder looks like this
__all__ = ['child_folder_1', 'child_folder_2', 'base_estimator']
The __init__.py file inside child_folder_2 looks like
from .base import load_pima_diabetes
from .base import load_titanic
from .base import load_iris
from .base import load_data
from .base import load_breast_cancer_wisconsin
from .base import load_boston_house_prices
from .base import load_axis_fi
from .base import load_bank_subscription
from .base import load_adult_income
__all__ = ['load_iris', 'load_boston_house_prices', 'load_bank_subscription', 'load_adult_income',
'load_breast_cancer_wisconsin', 'load_pima_diabetes', 'load_axis_fi', 'load_titanic', 'load_data']
Where .base is a file in child_folder_2 that defines several functions to load datasets. The __init__.py for the child_folder_1 is blank.
Doing this has created a small issue for me- autocomplete. Since I have made these __init__.py files, PyCharm doesn't show anything in autocomplete. I tried importing the child_folder_2 submodule by typing in from parent_folder. but then nothing displays.
Strange thing is that the code runs. It seems like I am missing on something but I can't figure out what. Any ideas on how why this might be occuring?

Not able to run python file which is under django project

I have my project tree like .
├── sizer
│   ├── manage.py
│   ├── node
│   │   ├── __init__.py
│   │   ├── __init__.pyc
│   │   ├── models.py
│   │   ├── models.pyc
│   │   ├── node_serializer.py
│   │   ├── node_serializer.pyc
│   │   ├── part_serializer.py
│   │   ├── part_serializer.pyc
│   │   ├── Part_Serializer.pyc
│   │   ├── test.py
│   │   ├── test.pyc
│   │   ├── tests.py
│   │   ├── tests.pyc
│   │   ├── urls.py
│   │   ├── urls.pyc
│   │   ├── views.py
│   │   └── views.pyc
│   ├── requirement.txt
│   ├── sizer
│   │   ├── __init__.py
│   │   ├── __init__.pyc
│   │   ├── settings.py
│   │   ├── settings.pyc
│   │   ├── urls.py
│   │   ├── urls.pyc
│   │   ├── wsgi.py
│   │   └── wsgi.pyc
│   ├── solver
│   │   ├── attrib.py
│   │   ├── attrib.pyc
│   │   ├── cap.py
│   │   ├── cap.pyc
│   │   ├── __init__.py
│   │   ├── node.py
│   │   ├── node.pyc
│   │   ├── nodes1.json
│   │   ├── nodes2.json
│   │   ├── parts.json
│   ├── strings.py
│   ├── strings.pyc
│   └── workload
│   ├── __init__.py
│   ├── __init__.pyc
│   ├── models.py
│   ├── models.pyc
│   ├── tests.py
│   ├── tests.pyc
│   ├── urls.py
│   ├── urls.pyc
│   ├── views.py
│   └── views.pyc
I have created node and workload app by manage.py startapp command .
In the above directory structure I copied solver .Now I am importing my node.model under sizer.py file like .
import json
from pulp import *
from attrib import *
from cap import *
from node import *
from wl import *
from sizer.node.models import Part,Node
When I run python solver/sizer.py I am keep on getting
ImportError: No module named node.models
Please help me out what might I am doing wrong here .Spent more then 4 hours still not able to figure out .
Thanks
If your app name is node then your import statement should look like:
from node.models import Part, Node
Note that this requires that you already included node in the INSTALLED_APPS in your settings.py.
There are multiple reasons why an import might fail.
The module is not on the path. To check this print sys.path in your script just before you import the module.
The module is broken and cannot be imported. You can check this by opening a Python console in the same directory as the module and attempting to import. Does that work?
Importing the module results in a CIRCULAR import. This means that the import imports another module that imports another module that imports the original module. This is easy enough to avoid with a little thought and a clear hierarchy.
So, which problem do you have? I have no idea because I can't see the sys.path, and I can't see the code in your files.
What I can see is a bit of a mess. You have multiple modules named 'node'. You have manage.py files at multiple levels. You've included the .pyc files in the output instead of editing them out for the reader. You have so many different modules called 'node', 'sizer' or 'solver' that it must be VERY confusing to figure out which one is being imported at any given time.
Your underlying problem might be that you are trying to work on a project without using source control (git) which means you don't know what changes broke things and you don't feel brave about making big changes because you have no way of stepping back in time if they don't work out.

ImportError under two identical folder

I run the same command under two identical Python project on 2 PCs
python ./main -xls nd.xls -xml nd.xml -t 1234
PC A : works greate
PC B throws the exception
Traceback (most recent call last):
File "./main", line 21, in <module>
from color_print import *
ImportError: No module named color_print
from color_print import *
from debug_tool import *
The both python edition are 2.7
I just curious why works on PC A and failed on PC B.
I must make some mistakes.
.
├── common
│   ├── Common
│   │   ├── __init__.py
│   │   ├── color_print.py
│   │   └── debug_tool.py
│   ├── Excel
│   │   ├── Xls.pyc
│   │   ├── XlsOperation.py
│   │   ├── XlsOperation.pyc
│   │   ├── __init__.py
│   │   └── __init__.pyc
│   ├── README.md
│   ├── __init__.py
│   ├── __init__.pyc
│   └── tmpl.py
├── main
├── nd.xls
├── nd.xml
├── nd_excel.py
├── nd_excel.pyc
├── nd_xml.py
├── nd_xml.pyc
└── origin_nd.xls

Categories