简体   繁体   中英

Python — import the package in a module that is inside the same package

I have a project structure something like this...

/some_app
    build/
    README
    out.py
    some_app/
        __init__.py
        mod1.py
        mod2.py

Now I want to import some_app package into mod2 , without messing with sys.path trickery. What I simply did is...

# mod2.py
import some_app

Now when I run the mod2.py from the command line

some_app $ python mod2.py

it throws error ImportError: No module named some_app

BUT, inside the out.py file, when I do

# out.py
import some_app.mod2

and then do

some_app $ python out.py

it runs perfectly.

Hence, what is happening is this. I load a package in a module that is within the same package, and then run that module as the __main__ file -- and it doesn't work. Next, I load the same module (the one that I ran as __main__ ) inside another module, and then run that another module as __main__ -- and it works.

Can someone please elaborate on what's going on here?

UPDATE

I understand that there is no straightforward reason for doing this -- because I could have directly imported any modules inside the some_app package. The reason I am trying this is because, in the Django project, this is what they're doing. See this file for example

In every module, all the non-standard imports start with django. . So I wondered why and how they are doing that.

UPDATE 2

Relevant links

mod2.py is part of some_app . As such, it makes no sense to import the module, since you're already inside it.

You can still import mod1 . I'm assuming you need some_app/__init__.py to run. Not sure that's possible.


EDIT:

Looks like from . import some_module from . import some_module will do what you're after.

You can do import some_app.mod2 from out.py because it is in the same directory that you have some_app package, and Python interpreter starts to look for modules from that path.

The import error in mod2.py is normal because there is not a some_app package in mod2.py folder.

It seems like "from . import some_module" works in Python3 only.

The universal way is to do all imports in init .py

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM