无法获得与 python 3.7.0 一起使用的绝对导入

Cannot get an absolute import to work with python 3.7.0

我有一个名为 dumdum 的根文件夹,其中包含一个 init 和一个名为 foo 的文件夹。 foo 中有一个 ini 和两个模块 foo1 和 foo6.

dumdum/

       __init__
       foo/

              __init__
              foo1
              foo6

我希望 foo6 在单独调用时以及在根文件夹 dumdum 中的主模块调用它时工作,所以我一直在努力研究如何让 foo6 在所有情况下工作,即我想要 foo6独立工作,当它不是主文件时。我 运行 来自 IDE 的 foo6。 Foo6 调用 foo1,但是当我这样做时出现错误:

ModuleNotFoundError 没有名为 'foo'

的文件夹

由于 foo 是 foo1 和 foo6 的父文件夹,我不明白为什么会这样。

foo1.py:

def printy(msg):
    print(msg)


def printing_mystr(mystr):
    printy(mystr)
    
if __name__ == "__main__":
    print(__name__)
    printing_mystr(r"I am a string in foo_1")

foo6.py

import sys, pathlib
import os

if __name__ == "__main__":
    # if foo is the root folder
    print(os.getcwd())
    print(str(pathlib.Path(__file__).parent))
    sys.path.append(str(pathlib.Path(__file__).parent))
    #for i in sys.path:
        #print(i)
    
    from foo.foo1 import printy, printing_mystr


if __name__ == "__main__":
    print(__name__)
    printing_mystr("Oh I am a string passed into foo_1")

当我 运行:

import sys

for i in sys.path:
    print(i)

我得到:

    C:\Users\priper\AppData\Local\Programs\Python\Python37\python37.zip
C:\Users\priper\AppData\Local\Programs\Python\Python37\DLLs
C:\Users\priper\AppData\Local\Programs\Python\Python37\Lib
C:\Users\priper\AppData\Local\Programs\Python\Python37
C:\Users\priper\AppData\Local\Programs\Python\Python37\Lib\site-packages

    C:\Users\priper\AppData\Local\Programs\Python\Python37\lib\site-packages\win32
C:\Users\priper\AppData\Local\Programs\Python\Python37\lib\site-packages\win32\lib
C:\Users\priper\AppData\Local\Programs\Python\Python37\lib\site-packages\Pythonwin
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\
C:\Users\priper\Desktop\dumdum\foo

回溯

ModuleNotFoundError 没有名为 'foo' 的模块 在 foo6.py...第 12 行

在没有任何进一步路径信息的情况下导入模块时,您需要将路径直接放在模块位置下方作为 sys.path 的成员。在您的情况下,将 C:\Users\priper\Desktop\dumdum 添加到 sys.path

如果您在文件夹 dumdum\foo\foo6 中启动 python 程序,那么 os.getcwd() 会给您 dumdum\foo\foo6。因此,您的 import from foo.foo1 import printy, printing_mystr 将不起作用。即使添加 pathlib.Path(__file__).parent 也是不够的,因为这是 dumdum\foo 而不是应该的 \dumdum