Ошибка ModuleNotFoundError при запуске скрипта - PullRequest
1 голос
/ 20 апреля 2020

Я изучил много вопросов, которые задавались ранее, но не смог найти решение своей проблемы.

Я выполняю команду python3 folder1 / script1.py на терминале в каталоге root, но я получаю сообщение об ошибке ModuleNotFoundError: нет модуля с именем 'folder2' . Я добавил __ init __. Py в папки, но все еще не смог найти решение.

Мой каталог проекта выглядит так:

└── root
    ├── folder1
    │   ├── script1.py
    │   
    └── folder2
        ├── module1.py

module1.py :

def say_hello():
    print('hello')

scipt1.py:

from folder2 import module1

module1.say_hello()

enter image description here

Ответы [ 2 ]

1 голос
/ 20 апреля 2020

Как правило, python модули должны быть установлены для python, чтобы найти их. Одним из побочных правил является то, что python будет искать в пути скрипта, чтобы увидеть, есть ли модуль там. Переместите script1.py вниз на уровень, убедитесь, что у вас есть __init__.py, и он будет работать.

└── root
    ├── script1.py
    │   
    └── folder2
        ├── __init__.py
        ├── module1.py

Вы также можете script1.py вставить его каталог прародителя в sys.path. Но на самом деле лучший способ решить эту проблему - сделать пакет устанавливаемым, добавив файл setup.py. Чрезвычайно примитивная версия -

import setuptools

setuptools.setup(
    name="Foobar",
    packages=setuptools.find_packages(),
    scripts=["folder1/script1.py"]
)

, и ваш каталог может быть

└── root
    ├── setup.py
    ├── folder1
    │   ├── script1.py
    │   
    └── folder2
        ├── __init__.py
        ├── module1.py

Теперь вы можете сделать python setup.py develop, чтобы запустить ваш скрипт из каталога разработки. Или python setup.py install (часто в созданном вами venv) для стандартной установки.

0 голосов
/ 20 апреля 2020

Правильное использование для init с двойным подчеркиванием;

__init__ 

Я добавил _ init _.py в папки, но все еще не смог найти решение.

Вы пишете init только с одним.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...