Organizing code - import question

B

Brian Blais

Hello,

I am trying to organize some of my code, and am having a little trouble with the
import logic. I find I often have something like:

MyPackage/
Part1/ # wants to use functions in Common/
__init__.py # does "from MyClass1 import MyClass1", etc,...
MyClass1.py
MyClass1a.py # depends on MyClass1
MyClass1b.py # depends on MyClass1

Part2/ # wants to use functions in Common/
__init__.py # does "from MyClass2 import MyClass2", etc,...
MyClass2.py # depends on MyClass1 also, such as containing a list of MyClass1
MyClass2a.py # depends on MyClass2
MyClass2b.py # depends on MyClass2

Common/
__init__.py # does "import fun1,fun2", etc,...
fun1.py
fun2.py



So I have some common utilities that both classes want to access, and I have two
separate class definitions, of which one depends on the other. In MyClass2.py, I
can't seem to do:

import Common.fun1

or

from Part1.MyClass1 import MyClass1


I think I am either missing some syntax/path thing, or I am thinking about the
organization in entirely the wrong way. Currently, as a hack, I am simply copying
the code from Common into the other two directories, and making a link to the Part1
directory in the Part2 so I can import it. There must be a better way, yes?


thanks,

Brian Blais
 
C

Carlos Hanson

Hello,

I am trying to organize some of my code, and am having a little trouble with the
import logic. I find I often have something like:

MyPackage/
Part1/ # wants to use functions in Common/
__init__.py # does "from MyClass1 import MyClass1", etc,...
MyClass1.py
MyClass1a.py # depends on MyClass1
MyClass1b.py # depends on MyClass1

Part2/ # wants to use functions in Common/
__init__.py # does "from MyClass2 import MyClass2", etc,...
MyClass2.py # depends on MyClass1 also, such as containing a list of MyClass1
MyClass2a.py # depends on MyClass2
MyClass2b.py # depends on MyClass2

Common/
__init__.py # does "import fun1,fun2", etc,...
fun1.py
fun2.py

So I have some common utilities that both classes want to access, and I have two
separate class definitions, of which one depends on the other. In MyClass2.py, I
can't seem to do:

import Common.fun1

or

from Part1.MyClass1 import MyClass1

I think I am either missing some syntax/path thing, or I am thinking about the
organization in entirely the wrong way. Currently, as a hack, I am simply copying
the code from Common into the other two directories, and making a link to the Part1
directory in the Part2 so I can import it. There must be a better way, yes?

thanks,

Brian Blais

--

It looks like you need __init__.py in MyPackage. Then you can import
starting with MyPackage. For example, you might use one of the
following:

import MyPackage
from MyPackage.Common import *
etc
 
B

Brian Blais

Carlos said:
It looks like you need __init__.py in MyPackage. Then you can import
starting with MyPackage. For example, you might use one of the
following:

import MyPackage
from MyPackage.Common import *
etc

that means that MyPackage must be in the sys path too? It doesn't seem like a
contained-module sees the container in any way.


bb
 
G

Gabriel Genellina

I am trying to organize some of my code, and am having a little trouble
with the import logic. I find I often have something like:

MyPackage/
Part1/ # wants to use functions in Common/
__init__.py # does "from MyClass1 import MyClass1", etc,...
MyClass1.py
MyClass1a.py # depends on MyClass1
MyClass1b.py # depends on MyClass1

Part2/ # wants to use functions in Common/
__init__.py # does "from MyClass2 import MyClass2", etc,...
MyClass2.py # depends on MyClass1 also, such as containing a
list of MyClass1
MyClass2a.py # depends on MyClass2
MyClass2b.py # depends on MyClass2

Common/
__init__.py # does "import fun1,fun2", etc,...
fun1.py
fun2.py



So I have some common utilities that both classes want to access, and I
have two separate class definitions, of which one depends on the other.
In MyClass2.py, I can't seem to do:

import Common.fun1

or

from Part1.MyClass1 import MyClass1

To be able to do that, MyPackage should be on sys.path
If its *container* (i.e. the directory containing MyPackage, perhaps
site-packages) is already on sys.path, you could prefix all imports with
the package name: import MyPackage.Common.fun1, or from MyPackage.Part1
import MyClass1
(Dont forget the __init__.py on MyPackage, to make it a real package)

If you are using Python 2.5, you can use relative imports. Read the
"What's new" document. In MyClass2.py you could use, then: from ..Common
import fun1, or: from ..Part1.MyClass1 import MyClass1
 
C

Carlos Hanson

that means that MyPackage must be in the sys path too? It doesn't seem like a
contained-module sees the container in any way.

That is exactly right. Without being in the sys path, Python does not
know where to look to resolve the import statements.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,989
Messages
2,570,207
Members
46,782
Latest member
ThomasGex

Latest Threads

Top