Reputation: 568
So I have tried many solutions found on stack overflow but am still having issues.
Below is my project structure.
project
| tool1
| - application.py
| resources
| - tools
| - dao.py
Within application.py I have the following import statement:
from resources.tools.dao import DAO
This works fine in PyCharm, but when I try to run it from the command line from the project directory (python tool1/application.py
), I get:
ModuleNotFoundError: No module named 'resources'
I get the same error if I move into 'tool1' folder and run: python application.py
I have tried adding .. before the imports, setting different folders as my source root folder through PyCharm, and adding blank __init__.py
files to the resources directory.
Why is PyCharm able to find 'resources' but the command line is not? How can I change this so that my solution works from either location?
If it helps, I am using Python 3.7 and Windows. I am open to restructuring the project directory, but there are going to be multiple tools/applications that will all use dao.py and the other tools in the resources directory, so resources should be at least as high level as the other projects.
Thank you in advance.
Upvotes: 2
Views: 1806
Reputation: 2835
I encountered a similar issue where I mistakenly included the databricks comment that declares a notebook (# Databricks notebook source
) in the file I tried to import from. Removing that line resolved the problem for me.
Thought it might help others.
Upvotes: 0
Reputation: 161
Run the script using the -m
argument. i.e.
python -m project.tool1.application
This makes the script run with the project
package in the namespace. (You may need to add an __init__.py
file to project
to make it a package)
Upvotes: 1
Reputation: 482
Another way to declare the parent directory path could be:
import os, sys
dir_path = os.path.dirname(os.path.realpath(__file__))
parent_dir_path = os.path.abspath(os.path.join(dir_path, os.pardir))
sys.path.insert(0, parent_dir_path)
And then this line would work without issues:
from resources.tools.dao import DAO
Upvotes: 0
Reputation: 486
Assuming you created __ init __.py in each directory. You could add to system path. It should import dao from anywhere. It works in linux for sure.
# tool1.__init__.py
import sys
import os
CURRPATH, TAIL = os.path.split(os.getcwd())
while CURRPATH != "/":
if TAIL == 'project':
if os.path.join(CURRPATH, TAIL) not in sys.path:
sys.path.append(os.path.join(CURRPATH, TAIL))
break
CURRPATH, TAIL = os.path.split(CURRPATH)
from resources.tools.dao import DAO
and in application.py
# tool1.application.py
from __init__ import DAO
Upvotes: 1
Reputation: 309
If project is your root directory (i.e. you have initialized pythonpath to this directory), then you need to import modules like this:
from project.resources.tools.dao import DAO
Upvotes: 0