还有一个ImportError:尝试相对导入,但没有已知的父包

时间:2019-12-26 14:29:41

标签: python import package python-import

我具有以下目录结构:

py_test
├── __init__.py
├── dir1
│   ├── __init__.py
│   └── script1.py
└── dir2
    ├── __init__.py
    └── script2.py

script2中,我要“ import ..\script1”。

我在script2中尝试过的事情:

  1. 不起作用

    from ..dir1 import script1
    ImportError: attempted relative import with no known parent package`
    
  2. 作品

    import sys, os
    path2add = os.path.normpath(os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir, 'dir1')))
    if (not (path2add in sys.path)) :
        sys.path.append(path2add)
    

如果我想使用选项1,最简单的文件/目录结构(即文件最少)是什么? 我知道this workaround,但是我想知道是否可以避免创建该目录结构,而仍然使用type-1 import

我当前使用的是How to import a Python class that is in a directory above?,它使用的是类型2 import

相关:

Import a module from a directory (package) one level up

Getting "ImportError: attempted relative import with no known parent package" when running from Python Interpreter

Using importlib to dynamically import module(s) containing relative imports

How to import variables in a different python file

validator

1 个答案:

答案 0 :(得分:2)

如评论中所述, 如果 script2.py是您的入口点,则尝试将模块导入目录将不起作用。

this link you included中所述:

如果模块的__name__不包含任何程序包信息(例如,将其设置为__main__),则相对导入的解析就好像该模块是顶级模块一样,无论在哪里该模块实际上位于文件系统上。

如果模块的__name__设置为__main__,或者它是您通过诸如python script2.py之类传递给解释器的入口,则设置为sys.path.append

任何这样运行的python模块不再具有从更高目录导入文件所需的信息。

因此,您有两个选择:

选项1:继续对script1使用解决方法

这可以按您希望的方式工作,但是相当麻烦。

选择2:将您的入口点设置为顶级

假设您的程序包中有多个脚本需要运行,则可以创建一个新文件,该文件同时导入script2sys.path,然后根据命令行参数调用所需的功能。这样一来,您就可以保持当前目录结构,并使相对导入工作正常,而不必担心const numbersToMessage = ["+15558675310", "+14158141829", "+15017122661"] numbersToMessage.forEach(async number => { const message = await client.messages.create({ body: 'message body', from: '+16468635472', to: number }); console.log(message.status) });