goFrendiAsgard
goFrendiAsgard

Reputation: 4084

importing python module from outside the package produce unexpected behavior

Let's say I have such a directory structure:

 - Documents/
   - thesis_program/
     - __init__.py
     - classes.py
     - utils.py
     - GE_Test.py
   - GE_Test_fail.py

classes.py and utils.py contains some classes and functions. GE_Test.py and GE_Test_fail.py contains the exactly same code, except the import part. In GE_Test.py I import classes and utils this way:

from utils import execute
from classes import Grammatical_Evolution

While in GE_Test_fail.py, I import classes and utils this way:

from thesis_program.utils import execute
from thesis_program.classes import Grammatical_Evolution

And unexpectedly I get a different result. Is there anything wrong here? Do I import the modules correctly?

I can ensure that the result should be the same, because I generate the random number with certain seed

Also classes.py is somehow depended on utils.py since I have several common functions in utils.py. I suspect that utils is also a name used by the system. So in the second case (GE_Test_fail.py) The system utils override my utils.py. But it doesn't seem make sense for me.

The complete source code of classes.py and utils.py is available here (if it helps to discover what's wrong): https://github.com/goFrendiAsgard/feature-extractor

And also, the screenshots: https://picasaweb.google.com/111207164087437537257/November25201204?authuser=0&authkey=Gv1sRgCOKxot2a2fTtlAE&feat=directlink

Upvotes: 2

Views: 3828

Answers (1)

namit
namit

Reputation: 6957

add below mentioned lines to your test files which are going outside of your thesis folder.

import sys
sys.path.insert(0,"/path to your thesis folder/thesis_program")

and maintain everything else; for example in GE_Test.py.. .

import sys
sys.path.insert(0,"/path to your thesis folder/thesis_program")
from utils import execute
from classes import Grammatical_Evolution

EDIT:

Or use this to make it more dynamic
(caution: don't try to find the path by os.path.abspath('./thesis_program') because it may not be always possible that you find your test_files and your thesis_folder are in the same dir; if you can fix them permanently in your code like above; then you are free to use them from anywhere on your system)

import os, sys
lib_path = os.path.abspath('./thesis_program')
sys.path.insert(0,lib_path)

Upvotes: 2

Related Questions