Let's say I have the following directory structure:
parent_dir/
foo_dir/
foo.py
bar_dir/
bar.py
If I wanted to import bar.py
from within foo.py
, how would I do that?
Let's say I have the following directory structure:
parent_dir/
foo_dir/
foo.py
bar_dir/
bar.py
If I wanted to import bar.py
from within foo.py
, how would I do that?
If all occurring directories are Python packages, i.e. they all contain __init__.py
, then you can use
from ..bar_dir import bar
If the directories aren't Python packages, you can do this by messing around with sys.path
, but you shouldn't.
sys.path
. –
Falbala ipython foo.py
on this, I get ImportError: attempted relative import with no known parent package
. I've added an __init__.py
file to the parent directory and the bar_dir
directory –
Benzocaine python3
also gives the same error. ImportError: attempted relative import with no known parent package
–
Lumpen You can use the sys
and os
modules for generalized imports. In foo.py
start with the lines
import sys
import os
sys.path.append(os.path.abspath('../bar_dir'))
import bar
foo.py
is. To use the script's directory, use sys.path.append(os.path.normpath(os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', 'bar')))
–
Mechellemechlin Let's say if you have following structure:
root
|_ productconst.py
|_ products
|_ __init__.py
And if you would like to import productconst in products.__init__
, then following can be used :
from ..productconst import *
If you're having issues in python 3+, the following worked for me using sys.path.append("..")
.
sys.path.append("..")
from bar_dir import bar
Most of the proposed answers have relied on altering sys.path
. IMHO - this is not neccessary if you can retain the relative folder structure correctly. I was inspired by the response of a similar question:
Please see my worked out example below. I have followed the same folder structure as in your question
After expanding the folder parent_dir
The file bar.py
implements a skeletal class Bar
class Bar():
def __init__(self) -> None:
pass
def __repr__(self) -> str:
return "This is an instance of Bar"
def some_method(self) ->None:
pass
from .bar import Bar
The file foo.py
implements a simple class Foo
which in turn references the class Bar
through a constructor parameter.
from ..bar_dir import Bar
class Foo():
def __init__(self ,bar_instance: Bar) -> None:
self._bar=bar_instance
def __repr__(self) -> str:
return f"You are inside an instance of Foo and you have just accessed bar={self._bar}"
from .foo import Foo
This is main runner script which glues together foo_dir
and bar_dir
packages
import parent_dir.bar_dir as bar_lib
import parent_dir.foo_dir as foo_lib
if __name__ == "__main__":
f=foo_lib.Foo(bar_instance=bar_lib.Bar())
print(f"This is an instance of foo={f}")
print(f"{bar_lib.Bar()}")
https://docs.python.org/3.9/tutorial/modules.html
© 2022 - 2025 — McMap. All rights reserved.