代码之家  ›  专栏  ›  技术社区  ›  Dolphin

如何解决python路径错误:尝试在没有已知父包的情况下进行相对导入

  •  0
  • Dolphin  · 技术社区  · 3 年前

    我想使用以下命令运行我的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.0\n")
    
    
    create_config()
    

    为什么会发生这种情况,我应该怎么做才能解决这个问题?

    0 回复  |  直到 3 年前
        1
  •  1
  •   MegaIng Mischa Lisovyi    3 年前

    当您使用直接执行脚本时 python <script name> ,那个脚本就是 __main__ 单元它不是一揽子计划的一部分。相对导入只能从包内部进行,因为python需要有一个相对导入的父包。

    考虑到你有 __init__.py 和一个 __main__.py 文件内部 NEMbox 文件夹,我想你可以通过执行(从包含 NEMbox ,例如。 musicbox ) python3 -m NEMbox 。这将执行模块 NEMbox 什么时候 NEMbox 是一个包,而不是直接的文件 NEMbox.__main__ 将执行(这正是您想要的)。

    (注意:我看不懂语言,但 original github page 似乎有精确的安装说明。