开发者

python import error

开发者 https://www.devze.com 2023-01-12 18:41 出处:网络
what\'s wrong with my imports? App folder structure: myapp/ models/models.py contains SpotModel() tests/tests.py contains TestSpotModel(unittest.TestCase). tests.py imports from myapp.models.model

what's wrong with my imports?

App folder structure:

myapp/

  • models/models.py contains SpotModel()
  • tests/tests.py contains TestSpotModel(unittest.TestCase). tests.py imports from myapp.models.models import * which works like a charm
  • scripts/import.py contains from myapp.models.models import *

the problem is that import.py when executed results in an error:

ImportError: No module named myapp.models.models
开发者_Go百科

but tests.py runs.

I have __init__.py files in myapp/__init__.py, myapp/models/__init__.py, myapp/tests/__init__.py and as mentioned, running the unit tests using nosetests works as intended.


It is __init__.py not init.py. Make sure each of the directory in hierarchy contains it in order to be able to import.

EDIT: I managed to reproduce it. Here's the directory structure:

cesar@cesar-laptop:/tmp/asdasd$ tree
.
`-- myapp
    |-- __init__.py
    |-- models
    |   |-- __init__.py
    |   `-- models.py
    |-- scripts
    |   |-- data.py
    |   `-- __init__.py
    `-- tests
        |-- __init__.py
        `-- tests.py

I put the following code at the very beginning of the data.py to narrow down the problem:

import sys
import pprint

pprint.pprint(sys.path)

from myapp.models.models import *

Running the data.py the way OP indicated yeilds ImportError:

cesar@cesar-laptop:/tmp/asdasd$ python myapp/scripts/data.py
['/tmp/asdasd/myapp/scripts',
 '/usr/lib/python2.6',
 '/usr/lib/python2.6/plat-linux2',
 '/usr/lib/python2.6/lib-tk',
 -- Skipped --
'/usr/local/lib/python2.6/dist-packages']
Traceback (most recent call last):
  File "myapp/scripts/data.py", line 6, in 
    from myapp.models.models import *
ImportError: No module named myapp.models.models

But this way works like a charm:

cesar@cesar-laptop:/tmp/asdasd$ python -m myapp.scripts.data
['',
 '/usr/lib/python2.6',
 '/usr/lib/python2.6/plat-linux2',
 '/usr/lib/python2.6/lib-tk',
 -- Skipped --
'/usr/local/lib/python2.6/dist-packages']

Note the difference in the first entry of sys.path.


How are you executing import.py? What is the current working directory when you do so?

The myapp directory must be on the Python path (ie. inside one of the directories listed in sys.path) for you to be able to import it. Python automatically adds the current working directory to the path list at interpreter startup time.

So if the directory that contains myapp is not added to the path manually (eg. using the PYTHONPATH environment variable, or adding it to sys.path in sitecustomize.py), you will need to be in the directory containing myapp when you run the script. If you're inside the myapp directory itself, you won't be able to import the myapp package.


Your sys.path is clearly not set the same way when you're running the test and when you're running the script. Do

import sys
print(sys.path)

at the top of both modules to confirm that. Then, fix the one that's wrong (by appending to sys.path the parent directory of myapp in the case where it's missing.


Unless you forgot to mention it, you don't have a __init__.py in myapp/scripts, so myapp/scripts/import.py is not a module of myapp.

Unless myapp is in your global path somehow, the script can't find it because it won't be looking for it in the right place.

Either make your scripts folder a module by adding a __init__.py to it, move the scripts up the filesystem hierarchy (either into myapp or into its parent folder) or install myapp into your path (i.e. move it to your packages folder, e.g. /usr/lib/python2.6/dist-packages/).

0

精彩评论

暂无评论...
验证码 换一张
取 消