Importing from subfolder in Python
Asked Answered
N

3

6

This is the situation. I'm using Python 3.6

I currently have the next folder organization:

/MainProject
  __init__.py
    /Folder1
      pyscript1.py
      pyscript2.py
      __init__.py
    /Folder2
      pyscript3.py
      __init__.py

So, I'm trying to get a function that exists in pyscript1.py from pyscript3. I've also added a init.py at every level. Inside pyscript3.py I tried the following:

from . import Folder1

Giving the error:

ImportError: cannot import name 'Folder1'

Also I tried:

from .Utils import script1

Giving the error:

ModuleNotFoundError: No module named '__main__.Utils'; '__main__' is not a 
package

I know that I can solve it using sys and os in the following manner:

sys.path.append(os.path.realpath('../..'))

But I wanted to know if this is possible without using sys.

Nasia answered 11/7, 2018 at 23:19 Comment(0)
H
9

Note that Folder1 is a directory, the .py scripts are your modules.

In pyscript3 you should be able to go:

from Folder1 import pyscript1

Then you can access a method with name methodname like:

pyscript1.methodname()

Otherwise you can import the method directly like:

from Folder1.pyscript1 import methodname

and use it like:

methodname()

EDIT:

For your program to see Folder1 and Folder2, you need to run your program from the MainProject folder.

Either move pyscript3 to your MainFolder or write another script, let's call it main.py, and call the necessary code to instantiate the class/call the function you want in pyscript3.py.

To summarize, you always want to run the entry module from the base folder of your project.

Hurtle answered 12/7, 2018 at 0:11 Comment(8)
That's the issue I commented, I Get ModuleNotFoundError: No module named 'Folder1'Nasia
You can't import Folder1, but you can import a script from Folder1. Can you maybe expand on your MainProject folder? Where is the entry-point?Hurtle
I'm trying to get from pyscript3 to pyscript1, the entry point would be pyscript3.Nasia
Could you show your main.py or equivalent file? Presumably it's in the MainProject folder?Hurtle
Also, how are you running your program? Simply python main.py?Hurtle
python pyscript3.pyNasia
Thanks for the response man. It seems like there is no workaround this, only create a script from the base projectNasia
No problem dude. Yeah that is the recommended way of structuring your project and executing your program.Hurtle
R
0

If still not working, check the PYTHONPATH Environment Variable you defined for your project. Sometimes one defines a PYTHONPATH just for the root folder of the project but wants to import modules from a folder that is inside the PYTHONPATH that is defined.

Options to solve this:

  1. Import the module adding the parent folder name, for example: import MainProject.Folder1.pyscript1 instead of import Folder1.pyscript1.
  2. Add another PYTHONPATH for the subfolder in which you have the modules to import.
Retriever answered 6/7, 2023 at 15:19 Comment(0)
D
-1

You could use from ..Folder1 import pyscript1 In pyscript3.py But you would have to load pyscript3 from the parent module or in your case MainProject.

Dorthadorthea answered 11/7, 2018 at 23:31 Comment(1)
That is two levels above, and doesn't work, and I can't load pyscript3 from the parent module, also if I use ..Folder1, that gives: ValueError: attempted relative import beyond top-level packageNasia

© 2022 - 2024 — McMap. All rights reserved.