简体   繁体   中英

Not able to import module from other directory in Python 3.7.1

I have a package structured as:

在此处输入图像描述

Classes in those packages are named exactly like the file names. Also, init .py has following code

from tableau_util import tableau_util
from sftp_util import sftp_util
from s3_util import s3_util

I have another file eg test.py which is outside this folder 'utils'. I want to import those classes into test.py so my code is

from utils.tableau_util import tableau_util
from utils.sftp_util import sftp_util
from utils.s3_util import s3_util

I am still getting the error:

ModuleNotFoundError: No module named 'tableau_util'

What can I try to resolve this?

Without knowing everything I would guess that you are trying to run your test.py as a normal python script. Given this folder structure

.
├── __init__.py
├── test
│   ├── __init__.py
│   └── test.py
└── utils
    ├── __init__.py
    ├── s3_util.py
    └── tableau_util.py

with these files test.py

from utils.s3_util import s3_util
from utils.tableau_util import tableau_util

s3_util()
tableau_util()

import sys

print(sys.path)

s3_util.py

def s3_util():
    print('Im a s3 util!')

tableau_util.py

def tableau_util():
    print('Im a tableu util!')

if you just tried to run python test/test.py in the main folder it will give you the ModuleNotFoundError . That's because it sets the ./test folder as the python path and it won't be able to see the utils folder and therefore be able to import it. However if you run it as python -m test.test (note the lack of .py you don't need it when you run it as a module) that will tell python to load it as a module and then it will run correctly with this output:

Im a s3 util!
Im a tableau util!

If you don't want to put the test.py in another folder you can simply keep it in the parent folder of utils and be able to run it in the traditional python test.py and get the same results. Error while finding spec for 'fibo.py' (<class 'AttributeError'>: 'module' object has no attribute '__path__') has some more reading on the matter.

For the record all my __init__.py files are empty and don't import anything and this is normally how they are setup unless you want to specify certain functions that need to be imported when the module is imported automatically.

I used PyCharm's create package option to create folders and files again and it is working now. Here are my new (working) folder structure:
在此处输入图像描述

My main script has following lines of code to import those classes:

from utils_pkg import tableau_util
from utils_pkg import s3_util
from utils_pkg import sftp_util

First, inside __init__.py (or in any sub-module that tries to import one of its siblings from the same package) you should add a "relative import" dot to the beginning of the module name, so that it reads:

from .tableau_util import tableau_util
#    ^right here

Second, make sure your current working directory is not utils . A good place to start, for testing, might be to cd to the parent directory of utils instead.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM