执行:
python deom/scripts/populate.py

ValueError: Attempted relative import in non-package

solve:python import时采用了相对路径,使用-m运行

执行:

python -m demo.scripts.populate


参考:http://my.oschina.net/leopardsaga/blog/97175

1. 从查到的资料来看,关于import路径的来说,分成3类:
  • absolute import
import xml
import youpackage.xml
from youpackage import xml
这几种都算绝对路径
 
  • relative import
import xml
从这个语句上是看不出来import的是标准库的xml,还是你的包里的一个库叫xml。
 
  • explicit relative import
from . import xml
from .xml import some_thing
from ..xml import some_thing
这些以点开头的import明确的表示了import的是相对路径,从而避免了普通relative import的麻烦。
 
2. 第二种(relative import)肯定是不推荐的。
  • 在python2.5以前,如果当前包中有一个叫xml的库,局部的这个xml就会shadow标准库的xml(和局部变量感觉类似,我犯过好几次这个错误,调试的时候还一定能反应过来)。
  • 在2.5和2.6,这个行为还是一样的,但是如果有以下这个语句,局部的包将不能覆盖全局的包
from __future__ import absolute_import
  • 在2.7中,absolute_import的行为变成了默认行为,如果需要应用局部的包,那就得用明确的相对引用了。
文档是这么描述的,但通过-m运行和直接运行py的行为还是会不一样,看下面这个例子:
$ python --version
Python 2.6.5
 
$ cat bar/baz.py 
from __future__ import absolute_import
import xml
print xml.__file__
 
$ python bar/baz.py 
/home/huanghao/workspace/test/bar/xml.pyc
 
$ python -m bar.baz
/usr/lib/python2.6/xml/__init__.pyc
 
看上去很奇怪,通过py运行的时候absolute_import好像根本没有作用,原因在这个blog里有解释
 
3.所以说relative import麻烦事太多,一定不能用了。但是absolute和explicit relative这两个到底用哪个?
PEP8中提到:
Relative imports for intra-package imports are highly discouraged. Always use the absolute package path for all imports. Even now that  PEP 328  is fully implemented in Python 2.5, its style of explicit relative imports is actively discouraged; absolute imports are more portable and usually more readable.
 
PEP8还是建议用absolute,即使PEP328实现了explicit relative。
本来我觉得到此就为止了。 但是今天还是有同事非要用explicit relative import,跟我说因为absolute写起来太长,而且当顶层包重命名时,所有的文件都需要修改。
我搜了半天也没找到有文章提到abs比rel一定要好的理由,除了PEP8提到的两个缺乏说服力的词more portable and more readable。
4.explicit relative import有一个小问题:
Relative imports use a module's __name__ attribute to determine that module's position in the package hierarchy. If the module's name does not contain any package information (e.g. it is set to '__main__') then relative imports are resolved as if the module were a top level module, regardless of where the module is actually located on the file system.
 
 
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.
 
PEP 338 -- Executing modules as scripts:  http://www.python.org/dev/peps/pep-0338/
 
虽然PEP338搞定了explicit relative import 在-m执行时的问题,但是搞不定直接文件执行的情况。所以用来做程序入口的模块必须使用绝对引用。
看一下这个例子:
$ python --version
Python 2.6.5
 
$ cat bar/baz.py 
from . import xml
print xml.__file__
 
$ python -m bar.baz
bar/xml.pyc
 
$ python bar/baz.py 
Traceback (most recent call last):
  File "bar/baz.py", line 1, in <module>
    from . import xml
ValueError: Attempted relative import in non-package

ValueError: Attempted relative import in non-package的更多相关文章

  1. ValueError: attempted relative import beyond top-level package

    python 项目 在pycharm中, 在某个文件夹下: 右键--> mark directory as --> source root 如何在python脚本或者shell中 用代码实 ...

  2. Python 相对导入attempted relative import beyond top-level package

    ValueError: attempted relative import beyond top-level package 假设有如下层次包目录 project/ __init__.py mypac ...

  3. Python ValueError: Attempted relative import in non-package Relative import相对引用 错误

    包含相对路径import的python脚本不能直接运行,只能作为module被引用. 例如 from . import mod1 有这样代码的文件只能最为moulule为不能直接运行.相对路径就是相对 ...

  4. Python导入自定义类时显示错误:attempted relative import beyond top-level package

    显示这个错误可能有两个原因: 1.文件夹中没有包含__init__.py文件,该文件可以为空,但必须存在该文件. 2.把该文件当成主函数入口,该文件所在文件夹不能被解释器视作package,所以可能导 ...

  5. python引入pytesseract报错:ValueError: Attempted relative import in non-package

    http://blog.csdn.net/yifengfuxue/article/details/79015651

  6. python:Attempted relative import in non-package

    problem:Attempted relative import in non-package 所谓相对路径其实就是相对于当前module的路径,但如果直接执行脚本,这个module的name就是“ ...

  7. 执行代码出现ImportError:attempted relative import with no known parent package

    前言 在这篇文章中,我将会解析 ImportError: attempted relative import with no known parent package 这个异常的原因.当你在运行的py ...

  8. Python工程:ImportError: attempted relative import with no known parent package

    Python工程:ImportError: attempted relative import with no known parent package 解决方法: 1.对每个目录创建的时候都选择创建 ...

  9. python相对包导入报“Attempted relative import in non-package”错误

    文章是从stackoverflow翻译过来的,原文地址:Relative imports for the billionth time 本文要在原理上解决  python当中相对包导入出现的问题. 问 ...

随机推荐

  1. Linux命令(3):mkdir命令

    1.作用:创建一个目录: 2.格式:mkdir [选项] 路径: 3.常见参数: 4.使用实例: [root@localhost ~]# mkdir -p ./hello/my [root@local ...

  2. Redis rdb文件CRC64校验算法 Java实现

    查看RDB文件结构,发现最后的8字节是CRC64校验算得,从文件头开始直到8字节校验码前的FF结束码(含),经过CRC64校验计算发现,貌似最后的8字节是小端模式实现的. 参考redis的crc64实 ...

  3. Cocos2d-x中触摸事件

    理解一个触摸事件可以从时间和空间两方面考虑. 1.触摸事件的时间方面 触摸事件的在时间方面,如下图所示,可以有不同的“按下”.“移动”和“抬起”等阶段,表示触摸是否刚刚开始.是否正在移动或处于静止状态 ...

  4. JS 截取字符串函数

    一.函数:split() 功能:使用一个指定的分隔符把一个字符串分割存储到数组 例子: str=”jpg|bmp|gif|ico|png”; arr=theString.split(”|”); //a ...

  5. CodeSmith Template Model Output

    背景:上学那会儿就接触CodeSmith,是一款非常优秀的代码自动生成工具.以前写过好些基本模版,可惜早不知道扔到哪儿去了,如今只能重新开始,把它捡回来,加油. 效果:将数据库 DataBase 应用 ...

  6. 详解在Visual Studio中使用git版本系统

    转自:http://www.uml.org.cn/pzgl/201206211.asp

  7. javascript原生获取元素的方法对比

    document.getElementsByTagName(li)获取的是数组,要获取指定值,需在后面加[0],[1]等,即document.getElementsByTagName(li)[0] d ...

  8. c# winform 点菜宝接口demo程序

    前几天写了一篇关于c#调用 win32API的文章,有同学对点菜宝接口感兴趣,所以就把写的demo程序共享出来,大家一起讨论改进,so放百度云地址: 百度云下载地址

  9. 链接中 href='#' 和 href='###' 的区别以及优缺点

    首先,<a> 标签 + onclick='{jscode}' 是很常用的一种 js 运用方式,而不使用 href='javascript:{jscode}' 是为了兼容多种浏览器对 < ...

  10. IE6/IE7中li底部4px的Bug

    当li的子元素中有浮动(float)时,IE6/IE7中<li>元素的下面会产生4px空隙的bug. XHTML <ul class="list"> < ...