MxLDevs
MxLDevs

Reputation: 19546

Relative import from current file

Currently I have a "main" folder where all of the modules I write eventually go, but I usually place the modules I'm currently working on in a 'dev' folder just so I don't clutter up the other folder with stuff that aren't ready.

The structure looks like this

MyProg
|-run.py
|-\lib
| |-someLibrary.py
| ...
|
|-\main
| |-readyScripts.py
| ...
|
|-\dev
  |-inProgress.py

Run.py will import scripts from the main folder.

Scripts in the main folder use relative imports to import someLibrary from the lib folder, and it works fine.

However, it doesn't work when I'm still writing my program in the dev folder and running it directly from there (ie: python inProgress.py), saying that I "attempted relative import in non-package"

Is there a way to be able to import modules from the lib folder while I am working on scripts in dev?

EDIT: this is my import statement in inProgress.py:

from .lib import someLibrary

Ideally, I would like to keep it this way so that when I move it to the main folder, I won't have to do anything to the import statement.

Upvotes: 4

Views: 3194

Answers (3)

kmdent
kmdent

Reputation: 1587

One option is to import is by using their path:

import imp

foo = imp.load_source('module.name', '/path/to/file.py')
foo.MyClass()

Upvotes: 1

Manny D
Manny D

Reputation: 20744

If you have your PYTHONPATH set to MyProg, what you can do is create an empty __init__.py file in each folder so python recognizes them as modules:

MyProg
|-run.py
|-__init__.py
|-\lib
| |-someLibrary.py
| |-__init__.py
| ...
|
|-\main
| |-readyScripts.py
| |-__init__.py
| ...
|
|-\dev
| |-inProgress.py
| |-__init__.py

So in your inProgress.py file, you could use:

import lib.someLibrary

In your run.py you could do this:

import main.readyScripts
import dev.inProgress

Upvotes: 3

Amber
Amber

Reputation: 527213

Set your PYTHONPATH to one level up, and then run it with the package syntax?

Upvotes: 0

Related Questions