执行:
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 命令行技巧

    这是一个linux常见命令的列表.那些有• 标记的条目,你可以直接拷贝到终端上而不需要任何修改,因此你最好开一个终端边读边剪切&拷贝.所有的命令已在Fedora和Ubuntu下做了测试 命令 ...

  2. Yii Framework处理网站前后台文件的方法

    此方法参考官方网站的cookbook,详细请看http://www.yiiframework.com/doc/cookbook/33/, 我在此基础上做了一些改动,人个感觉非常棒了,大家可以试一下! ...

  3. lucene4入门(2)搜索

    欢迎转载http://www.cnblogs.com/shizhongtao/p/3440479.html 接着上一篇,这里继续搜索,对于搜索和创建一样,首先你要确定搜索位置,然后用规定的类来读取.还 ...

  4. Kernel Panic常见原因以及解决方法

    Technorati 标签: Kernel Panic 出现原因 1. Linux在中断处理程序中,它不处于任何一个进程上下文,如果使用可能睡眠的函数,则系统调度会被破坏,导致kernel panic ...

  5. 文档生产工具 Doxygen

    Doxygen是一种开源跨平台的,类似JavaDoc风格描述的文档系统,支持C.C++.Java.Objective-C等语言.可以从一套归档源文件开始,生成HTML,XML,pdf等不同风格的格式. ...

  6. linux下golang的配置

    linux下golang的配置 之前开发golang一直在windows下,今天在linux下试了一下 ,遇到一些梗,比如go 找不到 sync包.花了一小时全部解决,把过程记录一下. 安装 go 我 ...

  7. JAVA_SE复习(多线程)

    线程 1.两种创建线程的方式都有自身的优点.  实现 Runnable 接口的优点:  从面向对象的设计观点看,Thread 类严格来讲是一个虚拟CPU 的封装,因此只有要改变或扩展该CPU 模型 ...

  8. MySQL的相关设置

    1.启动MySQL服务:#  service mysqld start 2.为MySQL设置root用户密码:# mysql -u root mysql>set password for roo ...

  9. L006-oldboy-mysql-dba-lesson06

    L006-oldboy-mysql-dba-lesson06 数据清理状态,先标记update table state=1,再删除. myisam没外键,硬件,并发,锁表力度,不支持事务,OLAP. ...

  10. 构造函数继承关键apply call

    主要我是要解决一下几个问题: 1.        apply和call的区别在哪里 2.        apply的其他巧妙用法(一般在什么情况下可以使用apply) 我首先从网上查到关于apply和 ...