Home > Enterprise >  python vscode modulenotfounderror
python vscode modulenotfounderror

Time:09-27

I have a certain project structure:

 - azima
   - .vscode
   - core
     - project_setup.py
   - helper
     - log_helper
   - venv

In project_setup.py:

import os
import json
import numpy as np
import pandas as pd
import random
from helper.log_helper import log

if __name__ == "__main__":
    print('hello world')

Running this file in terminal:

(venv) rmali@rakeshmali:~/git/azima$ /home/rmali/git/azima/venv/bin/python /home/rmali/git/azima/core/project_setup.py
Traceback (most recent call last):
  File "/home/rmali/git/azima/core/project_setup.py", line 6, in <module>
    from helper.log_helper import log
ModuleNotFoundError: No module named 'helper'

I get this error. What am I doing wrong? Am I missing something?

But running like this python -m core.project_setup works.

CodePudding user response:

Reason:

The path of folder azima does not in the sys.path(PYTHONPATH).

Solution:

You can do this to modify the PYTHONPATH:

  1. Add these in the settings.json file to Modify the PYTHONPATH in the terminal:

    "terminal.integrated.env.windows": { "PYTHONPATH": "xxx/site-packages" }

  2. Create a .env file under your workspace, and add these settings in it to modify the PYTHONPATH for the extension and debugger: PYTHONPATH=xxx/site-packages

You can refer to here to understand the effects of these two configurations.

  1. Modify it directly in the python file. Add these codes in the b.py file.

    import sys; sys.path.append("xxx/Project/src")

CodePudding user response:

The reason that running

(venv) rmali@rakeshmali:~/git/azima$ python ./core/project_setup.py

fails while

(venv) rmali@rakeshmali:~/git/azima$ python -m core.project_setup

succeeds is that when running python -m <module-name, Python adds the current directory to the start of sys.path, which allows modules in that directory such as helper to be imported as top level modules, i.e. with import helper. Running python <script> does not add the current directory to the start of sys.path. Instead, Python adds the directory containing the script to the start of sys.path.

Here are the relevant sections of the docs.

The -m switch

As with the -c option, the current directory will be added to the start of sys.path.

and the docs for the -c option add

the current directory will be added to the start of sys.path (allowing modules in that directory to be imported as top level modules)

Docs for python <script>

If the script name refers directly to a Python file, the directory containing that file is added to the start of sys.path, and the file is executed as the __main__ module.

If the script name refers to a directory or zipfile, the script name is added to the start of sys.path and the __main__.py file in that location is executed as the __main__ module.

  • Related