Liondancer
Liondancer

Reputation: 16489

ImportError: No module named when module is there

I usually run python2 but I am playing with python3. Right now I am confused as to why I am getting this error.

When I run the command ./test_web_events.py in the tests directory, I get:

Traceback (most recent call last):
  File "./test_web_events.py", line 21, in <module>
    import qe.util.scratchstore as scratchstore
ImportError: No module named 'qe'

However my project structure has qe directory in it:

/python_lib
   Makefile
   /qe
      __init__.py
      /tests
         __init__.py
         test_web_events.py
      /util
         __init__.py
         scratchstore.py
      /trinity
         __init__.py

I tried moving my /tests directory into /python_lib but I am still getting the same error:

MTVL1289dd026:python_lib bli1$ ls
Makefile    qe      rundata     setup.sh    tests
MTVL1289dd026:python_lib bli1$ python3 tests/test_web_events.py 
Traceback (most recent call last):
  File "tests/test_web_events.py", line 21, in <module>
    import qe.util.scratchstore as scratchstore
ImportError: No module named 'qe'

Here is my sys.path for python2

>>> import sys
>>> print sys.path
['', '/Library/Python/2.7/site-packages/pip-1.5.6-py2.7.egg', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python27.zip', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages', '/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-old', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload', '/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/PyObjC', '/Library/Python/2.7/site-packages']

sys.path for python3

>>> print(sys.path)
['', '/Library/Frameworks/Python.framework/Versions/3.4/lib/python34.zip', '/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4', '/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/plat-darwin', '/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/lib-dynload', '/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages']

Upvotes: 3

Views: 11807

Answers (4)

jfs
jfs

Reputation: 414875

The issue is that /python_lib is not in Python path. The behavior is the same on both Python 2 and 3.

In general, do not run scripts from within (inside) a Python package, run them from the top-level directory instead:

/python_lib$ python -m qe.tests.test_web_events

Thus /python_lib is in Python path and /python_lib/qe/tests is not. It assumes that there is tests/__init__.py file.

Do not modify sys.path manually. It may lead to subtle bugs related to importing modules. There are better alternatives e.g., if you don't want to run the scripts from /python_lib, just install the development version:

(your_virtualenv)/python_lib$ pip install -e .

Upvotes: 4

user4430624
user4430624

Reputation:

Just #!/usr/bin/env python add this to your all scripts. Make sure it's on the top.Like;

#!/usr/bin/env python
import qe

I assume you added Python 3 to path, if you did, the only problem is this. You do not need init.py or sys.path or anything. This line already finding Python path automatically if you added Python 3 to path, if Python 2 still on the path then it's normal you got error.

Upvotes: -1

dopstar
dopstar

Reputation: 1488

Make sure you have __init__.py file in all your package folders so that you tructure looks like

/python_lib
   Makefile
   /qe
      /tests
         test_web_events.py
      /util
         __init__.py                <------------ create this file
         scratchstore.py
      /trinity
      __init__.py

and then the you cd to python_lib folder and run ``export PYTHONPATH=`pwd```

Upvotes: 2

dursk
dursk

Reputation: 4445

This is most likely because you haven't added /python_lib/qe to your PYTHONPATH.

When you try to import a module, the interpreter will look for it only in a certain number of places, you cannot arbitrarily try to import a module from anywhere.

The most common ways are to have a package installed via pip, to have the module sitting in the same directory as the .py file, or to have added the path to that module to the PYTHONPATH.

See: https://docs.python.org/2/tutorial/modules.html#the-module-search-path

It seems like the latter case is most likely what you want to do. This is going to be dependent on your OS, but googling it should be straightforward.

Upvotes: 3

Related Questions