python的package问题


    常用的例子如下:

    package

    ----subpack1

         ----__init__.py

         ----module11.py

    ----subpack2

         ----__init__.py

         ----module21.py


      其中module.py内容如下:

    def funA():
	print "funcA in module 11"
	return


     现在在package中写一个测试脚本:

    from subpack1.module11 import *
    if __name__ == '__main__':
	 funA()


    写完测试没有问题,如果我们在module21..py中应用modle11.py中的函数或方法如何实现呢?

    如果在module21..py中内容如下:

 

   from subpack1 import module11


def funB():
    module11.funA()


if __name__ == '__main__':
    funB()


此时编译会报错,ImportError: No module named subpack1

如果再修改一下, from ..subpack1 import module11

此时还是会报错,ValueError: Attempted relative import in non-package

这个错误原因网上有解释,

包含相对路径import 的python脚本不能直接运行,只能作为module被引用。原因正如手册中描述的,所谓相对路径其实就是相对于当前module的路径,但如果直接执行脚本,这个module的name就是“__main__”, 而不是module原来的name, 这样相对路径也就不是原来的相对路径了,导入就会失败,出现错误“ValueError: Attempted relative import in non-package”
Note that both explicit and implicit relative imports are based on the name of the current module. Since the name of the main module is always"__main__", modules intended for use as the main module of a Python application should always use absolute imports.


但是如何解决这个问题呢,如何从一个模块中引用另一个模块,并且可以做单元测试,我这里提供一种办法,

import os,sys

#os.path.abspath(os.path.join(os.path.dirname('settings.py'),os.path.pardir))
module1 = os.path.abspath(os.path.join(os.getcwd(),os.path.pardir))
sys.path.append(module1)
print sys.path

from subpack1 import module11

def funB():
    module11.funA()

if __name__ == '__main__':
    funB()

通过将上级目录加入PYTHONPATH中就可以让解释器找到相应的模块。
      

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值