无法获得与 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
。
我有一个名为 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
。