加入收藏 | 设为首页 | 会员中心 | 我要投稿 阜阳站长网 (https://www.0558zz.cn/)- AI行业应用、低代码、混合云存储、数据仓库、物联网!
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

关于Python导入模块,你可能没学透

发布时间:2019-10-28 02:43:53 所属栏目:优化 来源:马哥Linux
导读:作为一名新手Python程序员,你首先需要学习的内容之一就是如何导入模块或包。但是我注意到,那些许多年来不时使用Python的人并不是都知道Python的导入机制其实非常灵活。在本文中,我们将探讨以下话题: 常规导入(regular imports) 使用from语句导入 相对

接下来进入 subpackage1文件夹,编辑其中的 __init__.py文件,输入以下代码:

  1. from 
  2.  .  
  3. import 
  4.  module_x 
  5. from 
  6.  .  
  7. import 
  8.  module_y 

现在编辑 module_x.py文件,输入以下代码:

  1. from 
  2.  .module_y  
  3. import 
  4.  spam  
  5. as 
  6.  ham 
  7. def 
  8.  main(): 
  9.  ham() 

最后编辑 module_y.py文件,输入以下代码:

  1. def 
  2.  spam(): 
  3.   
  4. print 
  5. ( 
  6. 'spam ' 
  7.  *  
  8. 3 
  9. ) 

打开终端, cd至 my_package包所在的文件夹,但不要进入 my_package。在这个文件夹下运行Python解释器。我使用的是IPython,因为它的自动补全功能非常方便:

  1. In 
  2.  [ 
  3. 1 
  4. ]:  
  5. import 
  6.  my_package 
  7. In 
  8.  [ 
  9. 2 
  10. ]: my_package.subpackage1.module_x 
  11. Out 
  12. [ 
  13. 2 
  14. ]: < 
  15. module 
  16.   
  17. 'my_package.subpackage1.module_x' 
  18.   
  19. from 
  20.   
  21. 'my_package/subpackage1/module_x.py' 
  22. > 
  23. In 
  24.  [ 
  25. 3 
  26. ]: my_package.subpackage1.module_x.main() 
  27. spam spam spam 

相对导入适用于你最终要放入包中的代码。如果你编写了很多相关性强的代码,那么应该采用这种导入方式。你会发现PyPI上有很多流行的包也是采用了相对导入。还要注意一点,如果你想要跨越多个文件层级进行导入,只需要使用多个句点即可。不过,PEP 328建议相对导入的层级不要超过两层。

还要注意一点,如果你往 module_x.py文件中添加了 if__name__==‘__main__’,然后试图运行这个文件,你会碰到一个很难理解的错误。编辑一下文件,试试看吧!

  1. from 
  2.  . module_y  
  3. import 
  4.  spam  
  5. as 
  6.  ham 
  7. def 
  8.  main(): 
  9.  ham() 
  10. if 
  11.  __name__ ==  
  12. '__main__' 
  13. : 
  14.   
  15. # This won't work! 
  16.  main() 

现在从终端进入 subpackage1文件夹,执行以下命令:

  1. python module_x.py 

如果你使用的是Python 2,你应该会看到下面的错误信息:

  1. Traceback 
  2.  (most recent call  
  3. last 
  4. ): 
  5.   
  6. File 
  7.   
  8. "module_x.py" 
  9. , line  
  10. 1 
  11. ,  
  12. in 
  13.   
  14. <module> 
  15.   
  16. from 
  17.  . module_y  
  18. import 
  19.  spam  
  20. as 
  21.  ham 
  22. ValueError 
  23. :  
  24. Attempted 
  25.  relative  
  26. import 
  27.   
  28. in 
  29.  non- 
  30. package 

如果你使用的是Python 3,错误信息大概是这样的:

  1. Traceback 
  2.  (most recent call  
  3. last 
  4. ): 
  5.   
  6. File 
  7.   
  8. "module_x.py" 
  9. , line  
  10. 1 
  11. ,  
  12. in 
  13.   
  14. <module> 
  15.   
  16. from 
  17.  . module_y  
  18. import 
  19.  spam  
  20. as 
  21.  ham 
  22. SystemError 
  23. :  
  24. Parent 
  25.   
  26. module 
  27.   
  28. '' 
  29.   
  30. not 
  31.  loaded, cannot perform relative  
  32. import 

这指的是, module_x.py是某个包中的一个模块,而你试图以脚本模式执行,但是这种模式不支持相对导入。

(编辑:阜阳站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读