资讯专栏INFORMATION COLUMN

python import 机制初探

leanxi / 578人阅读

摘要:引子考虑有如下代码结构情况其余文件为空。分析情况当我们运行时,这时候系统的搜素路径包括,我们可以通过在中添加证实这一点。情况情况其实和情况很不一样,情况叫做,也就是包内间接引用。顾名思义,这种引用方法只能在包内使用。都是,但不一定是。

引子

考虑有如下代码结构

.
├── cat
│   ├── __init__.py
│   ├── cat.py
│   └── moo.py
└── dog
    ├── __init__.py
    └── dog.py

2 directories, 5 files

情况1:

# ./cat/cat.py
import moo

其余文件为空。如果我们用运行命令: python cat/cat.py,则程序正常运行;如果运行命令;python -m cat.cat,则会报错;

情况2:

# ./cat/cat.py
from . import moo

则运行结果相反。

其实,我们的问题早就有人提出过了。PEP 395

The fact that most methods of invoking Python code from the command line break when that code is inside a package, and the two that do work are highly sensitive to the current working directory is all thoroughly confusing for a beginner. :如果一段代码在一个包内,那么从命令行使用这段代码是非常非常容易出错的,只有2种方法可行:

在整个包的外部,python -c "from module import code

在整个包的外部,通过-m参数执行。

如果在包内部,即使你的代码正确,也基本会出错。

分析

情况1:

当我们运行python cat/cat.py时,这时候系统的搜素路径包括./cat/,我们可以通过在./cat/cat.py中添加import sys; print(sys.path)证实这一点。

当我们运行 python -m cat.cat时,系统的搜索路径只包括.,也就是当前文件夹,我们可以通过在当前文件夹下添加一个moo.py文件,这样python -m cat.cat就不会报错了。可见,这时的搜索空间,不包括自文件夹。

情况2:

情况2其实和情况1很不一样,情况2叫做package relative import,也就是包内间接引用。顾名思义,这种引用方法只能在包内使用。也就是说,只能通过python -m cat.cat, 或者是python -c "from cat import cat" 之类的方法来使用。以下内容源自python官方文档中的 The import statement

When a module or package is contained within another package ... using leading dots in the specified module or package after from you can specify how high to traverse up the current package hierarchy without specifying exact names.

官方文档中的Package Relative Import 展示了详细的用法。

import

python中,载入一个包有几种方式:

import语句

importlib模块提供的方法

内置方法__import__ (不提倡)

python中,有module,有packagepackage都是module, 但module不一定是packagemodule只有一种,package有2种。

代码重载:importlib.reload

使用importlib.reload会重载当前代码。

import os
import importlib

import foo
print("foo.a: {}".format(foo.a))

command = "echo a=2 >> foo.py"

print(command)
os.popen(command)

importlib.reload(foo)
print("foo.a: {}".format(foo.a))

输出:

foo.a: 2
echo a=2 >> foo.py
foo.a: 2
参考资料

import 语法

PEP 395

PEP 420

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/45222.html

相关文章

  • 初探python之做一个简单小爬虫

    摘要:准备工作初探,这个文章属于自己的一个总结。所以教程面向新手,无技术含量。凡是报错信息看到,就是表示缩进不一致。注由于原网址不方便公布,代码中的网址全部替换为了。 准备工作 初探python,这个文章属于自己的一个总结。所以教程面向新手,无技术含量。python环境Linux基本都有,Windows下官网也提供了便利的安装包,怎么安装配置网上有很多教程在此就不一一说明。我使用的pytho...

    Juven 评论0 收藏0
  • python socket编程】—— 1.初探

    摘要:从导入相应函数,即传入一个上一步中的类,返回对应的网页内容,具体实现将在后续讲解。后续只要去处理解析请求和响应部分即可,主程序可以不用再修改。下一篇文章编程解析请求头 Flask或者其他框架都是封装的比较完善,我们可以不去关注路由、SESSION等到底是怎么实现的,现在我们使用socket来实现一个带有注册、登录功能的To do网站,这样能对后端框架了解的稍微更深入一点(当然你也可以直...

    int64 评论0 收藏0
  • Python Metaclass 初探

    摘要:以我们的程序为例,就是以为产生了一个名为的新类型,改类型的实现由给出,而就包含了通过返回的这个方法。从中找到这些类并一一执行测试。 先以一个大牛的一段关于Python Metapgramming的著名的话来做开头: Metaclasses are deeper magic than 99% of users should ever worry about. If you wonder ...

    nidaye 评论0 收藏0
  • python 做数据分析:pandas 的 excel 应用初探

    摘要:今天要分享的是,用来写。数据处理环节效率低下,易受干扰。问题排查难以溯源。一旦数据报告有误,想要定位问题所在,常常需要从头开始复盘。结果和上面结果结构是一致的。这是官网的文档,但是却不完全适用目前的场景。 大毛 岂安科技业务风险分析师 多年订单业务反欺诈经验,负责岂安科技多款产品运营工作。 上回笔者分享过一些 pandas 的常用数据查询语法,但是数据查询对于 pandas 而言只是冰...

    aervon 评论0 收藏0

发表评论

0条评论

leanxi

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<