Python module Import error for one user but not the other
Ran chmod 755 on all directories in python path.
Non-root user was able to execute script after this.
Unable to import a module that is definitely installed
In my case, it is permission problem. The package was somehow installed with root rw permission only, other user just cannot rw to it!
How to fix ImportError: No module named ... error in Python?
Python does not add the current directory to sys.path
, but rather the directory that the script is in. Add /home/bodacydo/work/project
to either sys.path
or $PYTHONPATH
.
Python error ImportError: No module named
Based on your comments to orip's post, I guess this is what happened:
- You edited
__init__.py
on windows. - The windows editor added something non-printing, perhaps a carriage-return (end-of-line in Windows is CR/LF; in unix it is LF only), or perhaps a CTRL-Z (windows end-of-file).
- You used WinSCP to copy the file to your unix box.
- WinSCP thought: "This has something that's not basic text; I'll put a .bin extension to indicate binary data."
- The missing
__init__.py
(now called__init__.py.bin
) means python doesn't understand toolkit as a package. - You create
__init__.py
in the appropriate directory and everything works... ?
ModuleNotFoundError' when trying to import module from imported package
FIRST, if you want to be able to access man1.py from man1test.py AND manModules.py from man1.py, you need to properly setup your files as packages and modules.
Packages are a way of structuring Python’s module namespace by using
“dotted module names”. For example, the module nameA.B
designates a
submodule namedB
in a package namedA
....
When importing the package, Python searches through the directories on
sys.path
looking for the package subdirectory.The
__init__.py
files are required to make Python treat the
directories as containing packages; this is done to prevent
directories with a common name, such asstring
, from unintentionally
hiding valid modules that occur later on the module search path.
You need to set it up to something like this:
man
|- __init__.py
|- Mans
|- __init__.py
|- man1.py
|- MansTest
|- __init.__.py
|- SoftLib
|- Soft
|- __init__.py
|- SoftWork
|- __init__.py
|- manModules.py
|- Unittests
|- __init__.py
|- man1test.py
SECOND, for the "ModuleNotFoundError: No module named 'Soft'
" error caused by from ...Mans import man1
in man1test.py, the documented solution to that is to add man1.py to sys.path
since Mans is outside the MansTest package. See The Module Search Path from the Python documentation. But if you don't want to modify sys.path
directly, you can also modify PYTHONPATH
:
sys.path
is initialized from these locations:
- The directory containing the input script (or the current directory when no file is specified).
PYTHONPATH
(a list of directory names, with the same syntax as the shell variablePATH
).- The installation-dependent default.
THIRD, for from ...MansTest.SoftLib import Soft
which you said "was to facilitate the aforementioned import statement in man1.py", that's now how imports work. If you want to import Soft.SoftLib in man1.py, you have to setup man1.py to find Soft.SoftLib and import it there directly.
With that said, here's how I got it to work.
man1.py:
from Soft.SoftWork.manModules import *
# no change to import statement but need to add Soft to PYTHONPATH
def foo():
print("called foo in man1.py")
print("foo call module1 from manModules: " + module1())
man1test.py
# no need for "from ...MansTest.SoftLib import Soft" to facilitate importing..
from ...Mans import man1
man1.foo()
manModules.py
def module1():
return "module1 in manModules"
Terminal output:
$ python3 -m man.MansTest.Unittests.man1test
Traceback (most recent call last):
...
from ...Mans import man1
File "/temp/man/Mans/man1.py", line 2, in <module>
from Soft.SoftWork.manModules import *
ModuleNotFoundError: No module named 'Soft'
$ PYTHONPATH=$PYTHONPATH:/temp/man/MansTest/SoftLib
$ export PYTHONPATH
$ echo $PYTHONPATH
:/temp/man/MansTest/SoftLib
$ python3 -m man.MansTest.Unittests.man1test
called foo in man1.py
foo called module1 from manModules: module1 in manModules
As a suggestion, maybe re-think the purpose of those SoftLib files. Is it some sort of "bridge" between man1.py and man1test.py? The way your files are setup right now, I don't think it's going to work as you expect it to be. Also, it's a bit confusing for the code-under-test (man1.py) to be importing stuff from under the test folder (MansTest).
Can't import my own modules in Python
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
import SomeObject
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.
Trouble importing a module that imports a module
The problem comes down to understanding the basics of the import system and the PYTHONPATH.
When you try to import a module (import module_a
), Python will search in order in every directory listed in sys.path
. If a directory matches the name (module_a
)1, then it runs the __init__.py
file is such exist.
When you get an [https://docs.python.org/3/library/exceptions.html#ImportError
], it means that there is no directory in sys.path
containing a directory with the name asked.
You said for your tests you did something like sys.path.insert(0, "some/path/")
, but it is not a solution, just a broken fix.
What you should do is set your PYTHONPATH
environment variable to contain the directory where your modules are located, Project-root/src
in your case. That way, no need to ever use sys.path.insert
, or fiddle with relative/absolute paths in import statements.
When you create your new environment, just set your environment variable PYTHONPATH
to include Project-root/src
and you are done. This is how installing regular Python modules (libraries) work : they are all put into a directory in site-packages
.
1: this changed since old Python versions, it used to be required for the directory to contain an __init__.py
file
Python - Module Not Found
All modules in Python have to have a certain directory structure. You can find details here.
Create an empty file called __init__.py
under the model
directory, such that your directory structure would look something like that:
.
└── project
└── src
├── hello-world.py
└── model
├── __init__.py
└── order.py
Also in your hello-world.py
file change the import statement to the following:
from model.order import SellOrder
That should fix it
P.S.: If you are placing your model
directory in some other location (not in the same directory branch), you will have to modify the python path using sys.path
.
Relative imports - ModuleNotFoundError: No module named x
As was stated in the comments to the original post, this seemed to be an issue with the python interpreter I was using for whatever reason, and not something wrong with the python scripts. I switched over from the WinPython bundle to the official python 3.6 from python.org and it worked just fine. thanks for the help everyone :)
Related Topics
Executing String Sent from One Terminal in Another in Linux Pseudo-Terminal
Colored Shell Script Output Library
Installing Node.Js on Debian 6.0
In Screen, How to Send a Command to All Virtual Terminal Windows Within a Single Screen Session
How to Make Stdout and Stderr Output Be of Different Colors in Xterm or Konsole
How to Download a File from the Internet to My Linux Server with Bash
Gcc Verbose Mode Output Explanation
Install Packages in Alpine Docker
Best File System for Serving 1Gb Files Using Nginx, Under Moderate Write, Read Performance-Wise
Testing Out of Disk Space in Linux
How to Correctly Cleanup and Re-Use Sysv Shared Memory Segments
Bash Script to Calculate Time Elapsed
Trying to Use Bash on Windows and Got No Installed Distributions Message
How to Speed Up Linux Kernel Compilation
What Is .D File After Building with Make