Python 模块相对引用
文件结构如下
python_directory/
├── __init__.py
└── app
├── __init__.py
├── sub1
│ ├── __init__.py
│ └── mod1.py
└── sub2
├── __init__.py
├── mod2.py
除了 mod1.py,其他文件内容都为空。
mod1.py
print('__name__: {}'.format(__name__))
print('__package__: {}'.format(__package__))
from ..sub2 import mod2
print('Import Successfully!')
如果 __package__ 不为空,相对引用会根据 __package__ 而不是 __name__[2]。
Relative Import In Non-Package
如果直接执行一个模块,那么它的 __name__ 为 __main__。Python 会认为这个模块是一个最顶层的模块,而不管这个模块在文件系统中的实际位置[1]。
$ pwd
/path_to/python_directory
$ python app/sub1/mod1.py
__name__: __main__
__package__: None
Traceback (most recent call last):
File "app/sub1/mod1.py", line 3, in <module>
from ..sub2 import mod2
ValueError: Attempted relative import in non-package
一个最顶层的模块 -- 我理解为 Python 把这个模块复制到在一个单独的目录中然后再执行,由于该目录下只有这个一个模块,
所以它不是一个 package。
Beyond Top Level Package
$ pwd
/path_to/python_directory/app
$ python -m sub1.mod1
__name__: __main__
__package__: sub1
Traceback (most recent call last):
File "/usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/lib/python2.7/runpy.py", line 174, in _run_module_as_main
"__main__", fname, loader, pkg_name)
File "/usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/lib/python2.7/runpy.py", line 72, in _run_code
exec code in run_globals
File "/path_to/python_directory/app/sub1/mod1.py", line 4, in <module>
from ..sub2 import mod2
ValueError: Attempted relative import beyond toplevel package
由于 -m sub1.mod1,Python 将 package 的顶层视为 sub1,而 ..sub2 位于 app/,超过了当前的最顶层 sub1,所以报错。
└── app
├── __init__.py
├── sub1
│ ├── __init__.py
│ └── mod1.py
└── sub2
正确的调用
$ pwd
/path_to/python_directory
$ python -m app.sub1.mod1
__name__: __main__
__package__: app.sub1
Import Successfully!
此时 ..sub2 相当于 app.sub2。
参考
- PEP 328 -- Imports: Multi-Line and Absolute/Relative
- PEP 366 -- Main module explicit relative imports
Python 模块相对引用的更多相关文章
- python 模块被引用多次但是里面的全局表达式总共只会执行一次
python 模块被引用多次但是里面的全局表达式总共只会执行一次
- 扩展Python模块系列(四)----引用计数问题的处理
承接上文,发现在使用Python C/C++ API扩展Python模块时,总要在各种各样的地方考虑到引用计数问题,稍不留神可能会导致扩展的模块存在内存泄漏.引用计数问题是C语言扩展Python模块最 ...
- python中模块的引用
一. 模块的定义 定义 python模块(Module),是一个python文件,以.py结尾,包含了python对象定义和python语句.模块让你能够有逻辑地组织你的python代码段,把相关的代 ...
- Python基础篇【第5篇】: Python模块基础(一)
模块 简介 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就 ...
- python模块及包的导入
一.模块 通常模块为一个文件,直接使用import来导入就好了.可以作为module的文件类型有".py".".pyo".".pyc".&q ...
- Python 对象的引用计数和拷贝
Python 对象的引用计数和拷贝 Python是一种面向对象的语言,包括变量.函数.类.模块等等一切皆对象. 在python中,每个对象有以下三个属性: 1.id,每个对象都有一个唯一的身份标识自己 ...
- Python模块学习
6. Modules If you quit from the Python interpreter and enter it again, the definitions you have made ...
- python 模块导入
1. 模块导入: 要使用一个模块,我们必须首先导入该模块.Python使用import语句导入一个模块.例如,导入系统自带的模块 math: import math 你可以认为math就是一个指向已导 ...
- python模块与包加载机制
模块的搜索路径: When a module named spam is imported, the interpreter searches for a file named spam.py in ...
随机推荐
- Linux经常使用命令(十五) - which
我们常常在linux要查找某个文件,但不知道放在哪里了.能够使用以下的一些命令来搜索: which 查看可运行文件的位置. whereis 查看文件的位置. locate 配合数据库查看文件位置 ...
- C++11 新特性之 变长參数模板
template <typename ... ARGS> void fun(ARGS ... args) 首先明白几个概念 1,模板參数包(template parameter pack) ...
- Jersey 1.18 API文档
Jersey 1.18 API文档 我自己制作了Jersey 1.18 API CHM文档, 下载地址见: http://download.csdn.net/detail/chszs/7334869 ...
- CSS之Position全面认识
CSS的很多其他属性大多容易理解,比如字体,文本,背景等.有些CSS书籍也会对这些简单的属性进行大张旗鼓的介绍,而偏偏忽略了对一些难缠的属 性讲解,有避重就轻的嫌疑.CSS中主要难以理解的属性包括盒型 ...
- Hibernate中所有包作用详细讲解
http://liyanblog.cn/articles/2012/09/17/1347848802900.html Hibernate一共包括了23个jar包,令人眼花缭乱.本文将详细讲解Hiber ...
- 【MyBatis学习02】走进MyBatis的世界
mybatis是个持久层的框架,用来执行数据库操作的,无外乎增删改查,上一节对mybatis有了宏观上的了解后,这一篇博客主要通过一个小示例来入门mybatis,先看一下要写的示例需求: 根据用户id ...
- css学习之overlay
CSS Overlay技巧 作者:大漠 日期:2013-11-10 点击:8 本文由大漠根据SARA SOUEIDAN的<CSS OVERLAY TECHNIQUES>所译,整个译文带 ...
- Note:pandas时间序列处理
Note 1.Time Series #1 from datetime import datetime now=datetime.now() now.year now.month now.day #2 ...
- Codeforces Round #244 (Div. 2)——Checkposts
题目链接 题意: 给定n个点,每一个点有一个权值的有向图.如今须要选定一些点,使得这些点权值和最小.且满足:假设i能到达j且j能到达i,那么i.j能够仅仅选一个 分析: 强联通模板题 //使用时仅仅更 ...
- Atitit.跨语言 文件夹与文件的io操作集合 草案
Atitit.跨语言 文件夹与文件的io操作集合 草案 1. Jdk原生的太难用了..1 2. PS: apache commons-io包,FileUtils有相关的方法,IOUtils一般是拷 ...