簡體   English   中英

無法獲得絕對導入以使用 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 no module named 'foo' in foo6.py ...第 12 行

在沒有任何進一步的路徑信息的情況下導入模塊時,您需要將模塊位置正下方的路徑作為sys.path的成員。 在您的情況下,將C:\Users\priper\Desktop\dumdum添加到sys.path

如果你在 dumdum dumdum\foo\foo6文件夾中啟動 python 程序,那么os.getcwd()會給你dumdum\foo\foo6 因此,您from foo.foo1 import printy, printing_mystr的導入將不起作用。 即使添加pathlib.Path(__file__).parent也是不夠的,因為這是dumdum\foo而不是應該的\dumdum

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM