I’m having a hard time understanding how module importing works in Python (I’ve never done it in any other language before either).
Let’s say I have:
myapp/__init__.py myapp/myapp/myapp.py myapp/myapp/SomeObject.py myapp/tests/TestCase.py
Now I’m trying to get something like this:
myapp.py =================== from myapp import SomeObject # stuff ... TestCase.py =================== from myapp import SomeObject # some tests on SomeObject
However, I’m definitely doing something wrong as Python can’t see that
myapp is a module:
ImportError: No module named myapp
import looks for files into your PYTHONPATH env. variable and your local directory. So you can either put all your files in the same directory, or export the path typing into a terminal::
In your particular case it looks like you’re trying to import
SomeObject from the myapp.py and TestCase.py scripts. From myapp.py, do
since it is in the same folder. For TestCase.py, do
from ..myapp import SomeObject
However, this will work only if you are importing TestCase from the package. If you want to directly run
python TestCase.py, you would have to mess with your path. This can be done within Python:
import sys sys.path.append("..") from myapp import SomeObject
though that is generally not recommended.
In general, if you want other people to use your Python package, you should use distutils to create a setup script. That way, anyone can install your package easily using a command like
python setup.py install and it will be available everywhere on their machine. If you’re serious about the package, you could even add it to the Python Package Index, PyPI.
exporting path is a good way. Another way is to add a .pth to your site-packages location.
On my mac my python keeps site-packages in /Library/Python shown below
I created a file called awesome.pth at /Library/Python/2.7/site-packages/awesome.pth and in the file put the following path that references my awesome modules
You can try
from myapp.myapp import SomeObject
because your project name is the same as the myapp.py which makes it search the project document first
In your first myapp directory ,u can add a setup.py file and add two python code in setup.py
from setuptools import setup setup(name='myapp')
in your first myapp directory in commandline , use pip install -e . to install the package
In my case it was Windows vs Python surprise, despite Windows filenames are not case sensitive, Python import is. So if you have
Stuff.py file you need to import this name as-is.
pip install on Windows 10 defaults to installing in ‘Program Files/PythonXX/Lib/site-packages’ which is a directory that requires administrative privileges. So I fixed my issue by running pip install as Administrator (you have to open command prompt as administrator even if you are logged in with an admin account). Also, it is safer to call pip from python.
python -m pip install <package-name>
pip install <package-name>
You need to have
in all the folders that have code you need to interact with.
You also need to specify the top folder name of your project in every import even if the file you tried to import is at the same level.
let’s say i write a module
import os my_home_dir=os.environ['HOME'] // in windows 'HOMEPATH' file_abs_path=os.path.join(my_home_dir,"my_module.py") with open(file_abs_path,"w") as f: f.write("print('I am loaded successfully')") import importlib importlib.util.find_spec('my_module') ==> cannot find
we have to tell python where to look for the module. we have to add our path to the
import sys sys.path.append(file_abs_path)
ModuleSpec(name='my_module', loader=<_frozen_importlib_external.SourceFileLoader object at 0x7fa40143e8e0>, origin='/Users/name/my_module.py')
we created our module, we informed python its path, now we should be able to import it
import my_module //I am loaded successfully
python -m ParentPackage.Submodule
Executing the required file via module flag worked for me. Lets say we got a typical directory structure as below:
my_project: | Core ->myScript.py | Utils ->helpers.py configs.py
Now if you want to run a file inside a directory, that has imports from other modules, all you need to do is like below:
python -m Core.myscript
PS: You gotta use dot notation to refer the submodules(Files/scripts you want to execute). Also I used python3.9+. So I didnt require neither any init.py nor any sys path append statements.
Hope that helps! Happy Coding!
This worked for me:
from .myapp import SomeObject
. signifies that it will search any local modules from the parent module.
If you use Anaconda you can do:
conda develop /Path/To/Your/Modules
from the Shell and it will write your path into a conda.pth file into the standard directory for 3rd party modules (site-packages in my case).
If you are using the IPython Console, make sure your IDE (e.g., spyder) is pointing to the right working directory (i.e., your project folder)
Besides the suggested solutions like the accepted answer, I had the same problem in Pycharm, and I didn’t want to modify imports like the relative addressing suggested above.
I finally found out that if I mark my src/ (root directory of my python codes) as the source in Interpreter settings, the issue will be resolved.
For a beginner trying to create modules via the def funcion for the first time, there is too much use of language that is meaningless or is made unintelligible by excessive use of technical terms. In Python, what does "(module) imported but unused" mean and how do I overcome this? Simple explanation with module name will be gratefully acknowledged or even a simple explanation via youtube will do. I am not likely to be employed as a programmer just a retired gentleman who is interested. Thank you all very much