| 
                         接下来进入 subpackage1文件夹,编辑其中的 __init__.py文件,输入以下代码: 
- from 
 -  .  
 - import 
 -  module_x 
 - from 
 -  .  
 - import 
 -  module_y 
 
  
现在编辑 module_x.py文件,输入以下代码: 
- from 
 -  .module_y  
 - import 
 -  spam  
 - as 
 -  ham 
 - def 
 -  main(): 
 -  ham() 
 
  
最后编辑 module_y.py文件,输入以下代码: 
- def 
 -  spam(): 
 -   
 - print 
 - ( 
 - 'spam ' 
 -  *  
 - 3 
 - ) 
 
  
打开终端, cd至 my_package包所在的文件夹,但不要进入  my_package。在这个文件夹下运行Python解释器。我使用的是IPython,因为它的自动补全功能非常方便: 
- In 
 -  [ 
 - 1 
 - ]:  
 - import 
 -  my_package 
 - In 
 -  [ 
 - 2 
 - ]: my_package.subpackage1.module_x 
 - Out 
 - [ 
 - 2 
 - ]: < 
 - module 
 -   
 - 'my_package.subpackage1.module_x' 
 -   
 - from 
 -   
 - 'my_package/subpackage1/module_x.py' 
 - > 
 - In 
 -  [ 
 - 3 
 - ]: my_package.subpackage1.module_x.main() 
 - spam spam spam 
 
  
相对导入适用于你最终要放入包中的代码。如果你编写了很多相关性强的代码,那么应该采用这种导入方式。你会发现PyPI上有很多流行的包也是采用了相对导入。还要注意一点,如果你想要跨越多个文件层级进行导入,只需要使用多个句点即可。不过,PEP  328建议相对导入的层级不要超过两层。 
还要注意一点,如果你往 module_x.py文件中添加了  if__name__==‘__main__’,然后试图运行这个文件,你会碰到一个很难理解的错误。编辑一下文件,试试看吧! 
- from 
 -  . module_y  
 - import 
 -  spam  
 - as 
 -  ham 
 - def 
 -  main(): 
 -  ham() 
 - if 
 -  __name__ ==  
 - '__main__' 
 - : 
 -   
 - # This won't work! 
 -  main() 
 
  
现在从终端进入 subpackage1文件夹,执行以下命令: 
- python module_x.py 
 
  
如果你使用的是Python 2,你应该会看到下面的错误信息: 
- Traceback 
 -  (most recent call  
 - last 
 - ): 
 -   
 - File 
 -   
 - "module_x.py" 
 - , line  
 - 1 
 - ,  
 - in 
 -   
 - <module> 
 -   
 - from 
 -  . module_y  
 - import 
 -  spam  
 - as 
 -  ham 
 - ValueError 
 - :  
 - Attempted 
 -  relative  
 - import 
 -   
 - in 
 -  non- 
 - package 
 
  
如果你使用的是Python 3,错误信息大概是这样的: 
- Traceback 
 -  (most recent call  
 - last 
 - ): 
 -   
 - File 
 -   
 - "module_x.py" 
 - , line  
 - 1 
 - ,  
 - in 
 -   
 - <module> 
 -   
 - from 
 -  . module_y  
 - import 
 -  spam  
 - as 
 -  ham 
 - SystemError 
 - :  
 - Parent 
 -   
 - module 
 -   
 - '' 
 -   
 - not 
 -  loaded, cannot perform relative  
 - import 
 
  
这指的是, module_x.py是某个包中的一个模块,而你试图以脚本模式执行,但是这种模式不支持相对导入。                         (编辑:91站长网) 
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! 
                     |