简体   繁体   中英

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?

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.

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