1. ModuleNotFoundError: No module named ‘main.f1stday’; ‘main’ is not a package

遇到个比较奇葩的问题,百度也没找到原因.看他报错意思是没找到那个模块。。。
首先先看下目录结构
代码也如上图,主要错误就是导入模块导致的。不过我这边是导入的.f1stday
然后被导入模块里面有个if ——name——==“——main——”


bob = {'name ':'Bob Smith','age':40,'pay':40000,'job':'dev'}
sue = {'name':'SUE jones','age':23,'pay':20000,'job':'eng'}
tom = {'name':'tom chen','age':24,'pay':80000,'job':'python'}
db = {}
db['bob']=bob
db['sue'] = sue
db['tom'] = tom

if __name__ == '__main__':
    import pickle
    for key in db:
        print(key,'=>',db[key])
    dbfile = open('people-pickle','wb')
    pickle.dump(db,dbfile)
    dbfile.close()

    file = open('people-pickle','rb')
    ab = pickle.load(file)
    print(ab)
    file.close()

 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

但是实际上这玩意儿不在顶层代码中并不会被执行也应该不会影响后面的东西。反正猜测就是from.的坑。所以后来将from.改成了具体的目录就解决了。
from python编程.fristday.f1stday import tom
然后第二个猜测是被导入模块的测试代码引起的,删掉测试代码之后的东西进行测试发现结果还是那个结果,所以排除测试代码即if ——name——==“——main——”的原因。那么在这段代码里面 .from xx import xxxxx是行不通的,必须要明确的指出导入路径。具体是什么原因我还是没搞懂。从各个文档上面来看 from. import xxx理论上是没有问题的。暂时这个问题我确实找不到原因,也没查到有效的资料,之后慢慢深入再来找原因,这个问题先记录在这里

更新
===========================================================

后来在Stack Overflow上面看到一个小哥的解释觉得很有道理,自己试了一下也重现了这个问题
那就是你的那个文件夹可能没有init.py这个文件,遂删除这个文件尝试相对导入果然就报了这个错误。
然后之前有印象记得还有个大兄弟也没找到这个原因但是解决了这个问题,他的方法是选中你相对导入的那个文件夹,右键,然后选中 Mark Directory as 具体如图:
但是具体博客地址记不得了,如果那位大兄弟看到了麻烦私信我地址,贴上去。确实找不到了,是前段时间看到的,但是一直没找到原因所以也没有来更新,见谅。

2. 解决python相对导入出现错误:Attempted relative import beyond toplevel package

原因:相对导入

通过查找相关资料,定位到这是一个包、模块相对导入所引起的。

引起这个问题的代码类似如下:

from .package import mymodule
 
if __name__=="__main__":
    do_something()

更改: 
比较简单的一种是将”.”之前加上文件夹的名字,形如:

from my_dir.package import mymodule

分析

在main函数中执行时,__name__这个变量值是”__main__”。而相对引用符号”.”的就是对应__name__这个变量。

当这个模块是在别的模块中被导入使用,此时的”.”就是原模块的文件名。在main函数中执行时,此时”.”变成了”__main__”。

所以,出现了这个问题。


总结

以后如何避免此类问题呢?

  1. 需要执行main的模块中,将相对引用改为绝对引用。较常见的比如单元测试类中的导入。
  2. 保证工程的入口点的唯一性。

3. 在Python中以绝对路径或者相对路径导入文件(或模块)的方法

参考

  1. ModuleNotFoundError: No module named ‘main.f1stday’; ‘main’ is not a package
  2. python: main is not a package
  3. Python包的相对导入时出现错误的解决方法
  4. 相对导入问题总结:attempted relative import with no known parent package
  5. 解决python相对导入出现错误:Attempted relative import beyond toplevel package
  6. 在Python中以绝对路径或者相对路径导入文件(或模块)的方法