Importing within project - modules not working - python

I have a project with the current structure, but some of my imports are not working when I think they should be. Shoudn't these imports work since the folders are properly marked as modules?
foo
├── app
│ ├── app.py
│ ├── folder1
│ │ ├── aaa.py
│ │ └── __init__.py
│ ├── folder2
│ │ ├── bbb.py
│ │ ├── __init__.py
│ ├── folder3
│ │ ├── ccc.py
│ │ ├── __init__.py
│ ├── __init__.py
│ └── main.py
├── README.md
└── .gitignore
WORKS
aaa.py
class X():
pass
main.py
from folder1.aaa import X
PWD: foo folder
CMD: python app/main.py
DOES NOT WORK
aaa.py
class X():
pass
main.py
from app.folder1.aaa import X
PWD: foo folder
CMD: python app/main.py
Traceback (most recent call last):
File "foo/app/main.py", line 1, in <module>
from app.folder1.aaa import X
ModuleNotFoundError: No module named 'app'
DOES NOT WORK
aaa.py
from app.folder2.bbb import Y
class X(Y):
pass
bbb.py
class Y():
pass
main.py
from folder1.aaa import X
PWD: foo folder
CMD: python app/main.py
File "foo/app/folder1/aaa.py", line 1, in <module>
from app.folder2.bbb import Y
ModuleNotFoundError: No module named 'app'

Python import works by searching the paths in sys.path.
check whether app is added to sys.path by running the below code
import sys
print(sys.path)
if it is not present in this list, append sys.path by including app directory.
import sys
import os
current_loc = os.path.realpath(__file__)
parent_dir = os.path.dirname(os.path.dirname(current_loc))
sys.path.append(parent_dir)

Related

ImportError: No module named <module name> for local module imports in Python

I am very new to Python and I have the following structure for a project:
server/
├── config/
│ ├── __init__.py
│ ├── application.py
│ ├── dev.py
│ └── qa.py
├── lib/
│ ├── __init__.py
│ ├── redisdb.py
│ ├── logger.py
│ └── geo.py
└── scripts/
├── __init__.py
├── my_first_script.py
└── my_second_script.py
and in my_first_script.py file, I have the following code:
import pickle
from lib.redisdb import r
import re
import config.application as appconf
print( appconf.DOCUMENT_ENDPOINT )
partnerData = pickle.loads(r.get("partner_date_all"))
print( len(partnerData) )
When I run this code in the terminal using the command
python server/scripts/my_first_script.py
I am getting the following error:
Traceback (most recent call last):
File "my_first_script.py", line 3, in <module>
from lib.redisdb import r
ImportError: No module named lib.redisdb
I am using Python 2.7 version here. When I checked with Python 3 also, I have the same error. Now how can I execute this file? If my code doesn't have imports from the other local modules, everything works just fine.
Your modules are all siblings and you didn't not declare a parent package.
You could modify your structure this way so your modules can know each other.
server/ (assuming this is your project root)
server/ (assuming you want to call your package "server")
├── __init__.py
├── server.py (your package entry point)
├── config/
│ ├── __init__.py
│ ├── application.py
│ ├── dev.py
│ └── qa.py
├── lib/
│ ├── __init__.py
│ ├── redisdb.py
│ ├── logger.py
│ └── geo.py
└── scripts/
├── __init__.py
├── my_first_script.py
└── my_second_script.py
And now your imports can refer to the parent package:
for example:
# my_first_script.py
from server.config import application

Python finding subdirectories with pkgutil's extend_path

This is my folder structure
src
├── __init__.py
└── foo
├── __init__.py
└── bar
├── __init__.py
├── events
│ ├── __init__.py
│ ├── execute
│ │ ├── __init__.py
│ │ ├── helloworld.py
│ │ ├── run.py
└── settings.py
$ cat src/foo/__init__.py outputs...
from pkgutil import extend_path
__path__ = extend_path(__path__, __name__)
in src/foo/bar/events/execute/run.py, I want to do something like this
from foo.bar.events.execute.helloworld import HelloWorld
I get the error
No module named 'foo.bar'
This is how I'm running my app
I understand it's not proper, but there's a reason I just simplified the question for brevity
$ python src/foo/bar/events/execute/run
How do I achieve importing this way from src/foo/bar/events/execute/run.py?
from foo.bar.events.execute.helloworld import HelloWorld

python import from different level directory no module find

python import from different level directory getting import error
Directory structure.
# all __init__.py files are empty
import/
├── helpers
│ ├── __init__.py
│ ├── helper1
│ │ ├── __init__.py
│ │ ├── helper1_module1.py
│ │ └── helper1_module2.py
│ └── helper2
│ ├── __init__.py
│ ├── helper2_module1.py
│ └── helper2_module2.py
└── services
├── __init__.py
├── service1
│ ├── __init__.py
│ └── service1_api.py
└── service2
helper1_module1.py
class Helper1Module1():
def function1(self):
print("executed from Helper1Module1 Class function1")
def function2(self):
print("executed from Helper1Module1 Class function2")
service1_api.py
from helpers.helper1.helper1_module1 import Helper1Module1
h = Helper1Module1()
h.function1()
Error:
python3 services/service1/service1_api.py
Traceback (most recent call last):
File "services/service1/service1_api.py", line 1, in <module>
from helpers.helper1.helper1_module1 import Helper1Module1
ModuleNotFoundError: No module named 'helpers'
How to fix this?
Python: python3.6 and above
OS: Linux
You have to set the file path (PYTHONPATH) manually to use the files from other directories.
You can export Environment Variable like
export PYTHONPATH=’path/to/directory’
Or you can use sys module: Importing files from different folder

Python importing module from another directory

I want to import the module from another directory scripts/driver/scheduler.py to run.py and execute it, but every time I get the following error msg
ModuleNotFoundError: No module named 'scripts'
I added empty init.py files, but it didn't solve the issue
Here are a tree and the code:
.
├── __init__.py
├── pythonmodules
│ ├── module
│ │ └── run.py
│ └── setup
│ └── smthelse
└── scripts
├── driver
│ ├── __init__.py
│ └── scheduler.py
└── resources
└── smthelse
run.py
import argparse
import os.path as op
from scripts.driver.scheduler import scheduler
some lines of code
s = scheduler()
scheduler.py
import re
import sys
class scheduler():
some code
if __name__ == '__main__':
s = scheduler()
Could somebody explain why it doesn't work?
Somehow pythonpath was missing. The following export fixed it:
export PYTHONPATH=$PYTHONPATH:/home/user/myapp

pytest can't load test modules with __init__.py

When using pytest to run a specific test, I get the following error:
>>> pytest test/test_app.py
ImportError while importing test module '/home/connesy/code/test/test_app.py'.
Traceback:
test/test_app.py:3: in <module>
import __init__
E ModuleNotFoundError: No module named '__init__'
My code is structured like this:
├── src
│ ├── __init__.py
│ ├── conftest.py # Empty
│ ├── app.py
│ ├── server.py
├── test
│ ├── __init__.py
│ ├── test_app.py
│ ├── test_server.py
Each test has import __init__ at the top, and __init__ adds src to sys.path.
I need to be able to import and run tests from server.py, so test needs to be a package. How can I run a specific test with pytest with this structure?

Categories

Resources