加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

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

发布时间:2019-10-27 23:21:16 所属栏目:建站 来源:马哥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. 'spam ' 
  6.  *  

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

  1. In 
  2.  [ 
  3. ]:  
  4. import 
  5.  my_package 
  6. In 
  7.  [ 
  8. ]: my_package.subpackage1.module_x 
  9. Out 
  10. ]: < 
  11. module 
  12.   
  13. 'my_package.subpackage1.module_x' 
  14.   
  15. from 
  16.   
  17. 'my_package/subpackage1/module_x.py' 
  18. In 
  19.  [ 
  20. ]: my_package.subpackage1.module_x.main() 
  21. 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. # This won't work! 
  15.  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. ,  
  11. in 
  12.   
  13. <module> 
  14.   
  15. from 
  16.  . module_y  
  17. import 
  18.  spam  
  19. as 
  20.  ham 
  21. ValueError 
  22. :  
  23. Attempted 
  24.  relative  
  25. import 
  26.   
  27. in 
  28.  non- 
  29. package 

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

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

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

(编辑:核心网)

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

热点阅读