как устранить ошибку пути python: попытка относительного импорта без известного родительского пакета

#python

Вопрос:

Я хочу запустить свой код на python с помощью этой команды:

 python3.8 __main__.py
 

но показывает эту ошибку:

 [dolphin@MiWiFi-R4CM-srv]~/Documents/GitHub/musicbox/NEMbox% python3.8 __main__.py 
Traceback (most recent call last):
  File "__main__.py", line 9, in <module>
    from . import __version__
ImportError: attempted relative import with no known parent package
 

это __main__.py файл:

 #!/usr/bin/env python
# -*- coding: utf-8 -*-
import _curses
import argparse
import curses
import sys
import traceback

from . import __version__
from .menu import Menu


def start():
    version = __version__

    parser = argparse.ArgumentParser()
    parser.add_argument(
        "-v", "--version", help="show this version and exit", action="store_true"
    )
    args = parser.parse_args()

    if args.version:
        latest = Menu().check_version()
        try:
            curses.endwin()
        except _curses.error:
            pass
        print("NetEase-MusicBox installed version:"   version)
        if latest != version:
            print("NetEase-MusicBox latest version:"   str(latest))
        sys.exit()

    nembox_menu = Menu()
    try:
        nembox_menu.start_fork(version)
    except (OSError, TypeError, ValueError, KeyError, IndexError):
        # clean up terminal while failed
        try:
            curses.echo()
            curses.nocbreak()
            curses.endwin()
        except _curses.error:
            pass
        traceback.print_exc()


if __name__ == "__main__":
    start()
 

и это __init__.py файл на том же уровне __main__.py :

 from importlib_metadata import version

from .const import Constant
from .utils import create_dir
from .utils import create_file

__version__ = version("NetEase-MusicBox")


def create_config():
    create_dir(Constant.conf_dir)
    create_dir(Constant.download_dir)
    create_file(Constant.storage_path)
    create_file(Constant.log_path, default="")
    create_file(Constant.cookie_path, default="#LWP-Cookies-2.0n")


create_config()
 

почему это произошло и что я должен сделать, чтобы решить эту проблему?

Ответ №1:

Когда вы непосредственно выполняете сценарий с python <script name> помощью , этот сценарий является __main__ модулем. Это не является частью пакета. Относительный импорт работает только изнутри пакета, так как python должен иметь родительский пакет для импорта относительно.

Учитывая, что у вас есть __init__.py и __main__.py файл внутри NEMbox папки , я предполагаю, что вы можете заставить его правильно мыслить, выполнив (из папки, которая содержит NEMbox , например musicbox ) python3 -m NEMbox . Это приведет к выполнению модуля NEMbox . Когда NEMbox будет выполнен пакет, а не непосредственно файл NEMbox.__main__ (что вам здесь нужно).

(Примечание: я не могу прочитать язык, но на оригинальной странице github, похоже, есть точные инструкции по установке.