Roman
Roman

Reputation: 1466

Expanding sys.path via __init__.py

There're a lot of threads on importing modules from sibling directories, and majority recommends to either simply add init.py to source tree, or modify sys.path from inside those init files.

Suppose I have following project structure:

project_root/
    __init__.py
    wrappers/
        __init__.py
        wrapper1.py
        wrapper2.py
    samples/
        __init__.py
        sample1.py
        sample2.py

All init.py files contain code which inserts absolute path to project_root/ directory into the sys.path. I get "No module names x", no matter how I'm trying to import wrapperX modules into sampleX. And when I try to print sys.path from sampleX, it appears that it does not contain path to project_root.

So how do I use init.py correctly to set up project environment variables?

Upvotes: 0

Views: 2245

Answers (1)

Torben Klein
Torben Klein

Reputation: 3116

Do not run sampleX.py directly, execute as module instead:

# (in project root directory)
python -m samples.sample1

This way you do not need to fiddle with sys.path at all (which is generally discouraged). It also makes it much easier to use the samples/ package as a library later on.

Oh, and init.py is not run because it only gets run/imported (which is more or less the same thing) if you import the samples package, not if you run an individual file as script.

Upvotes: 2

Related Questions