python关于包的题怎么做_Python自定义包引入

python中的Module是比较重要的概念。常见的情况是,事先写好一个.py文 件,在另一个文件中需要import时,将事先写好的.py文件拷贝 到当前目录,或者是在中增加事先写好的.py文件所在的目录,然后import。这样的做法,对于少数文件是可行的,但如果程序数目很 多,层级很复杂,就很吃力了。有没有办法,像Java的Package一样,将多个.py文件组织起来,以便在外部统一调用,和在内部互相调用呢?答案是有的。主要是用到python的包的概念,python

__init__.py在包里起一个比较重要的作用要弄明白这个问题,首先要知道,python在执行import语句时,到底进行了什么操作,按照python的文档,它执行了如下操作:第1步,创建一个新的,空的module对象(它可能包含多个module);第2步,把这个module对象插入sys.module中第3步,装载module的代码(如果需要,首先必须编译)第4步,执行新的module中对应的代码。在执行第3步时,首先要找到module程序所在的位置,其原理为:如 果需要导入的module的名字是m1,则解释器必须找到m1.py,它首先在当前目录查找,然后是在环境变量PYTHONPATH中查找。 PYTHONPATH可以视为系统的PATH变量一类的东西,其中包含若干个目录。如果PYTHONPATH没有设定,或者找不到m1.py,则继续搜索 与python的安装设置相关的默认路径,在Unix下,通常是/usr/local/lib/python。事实上,搜索的顺序是:当前路径 (以及从当前目录指定的sys.path),然后是PYTHONPATH,然后是python的安装设置相关的默认路径。正因为存在这样的顺序,如果当前 路径或PYTHONPATH中存在与标准module同样的module,则会覆盖标准module。也就是说,如果当前目录下存在xml.py,那么执 行import

xml时,导入的是当前目录下的module,而不是系统标准的xml。了解了这些,我们就可以先构建一个package,以普通module的方式导入,就可以直接访问此package中的各个module了。Python中的package定义很简单,其层次结构与程序所在目录的层次结构相同,这一点与Java类似,唯一不同的地方在于,python中的package必须包含一个__init__.py的文件。例如,我们可以这样组织一个package:

package1/ __init__.py subPack1/ __init__.py module_11.py module_12.py module_13.py subPack2/ __init__.py module_21.py module_22.py

……

__init__.py可以为空,只要它存在,就表明此目录应被作为一个package处理。当然,__init__.py中也可以设置相应的内容,下文详细介绍。好了,现在我们在module_11.py中定义一个函数:def funA(): print "funcA in module_11" return在顶层目录(也就是package1所在的目录,当然也参考上面的介绍,将package1放在解释器能够搜索到的地方)运行python:

>>>from package1.subPack1.module_11 import funcA>>>funcA()

funcA in module_11这样,我们就按照package的层次关系,正确调用了module_11中的函数。细心的用户会发现,有时在import语句中会出现通配符*,导入某个module中的所有元素,这是怎么实现的呢?答案就在__init__.py中。我们在subPack1的__init__.py文件中写__all__ = ['module_13', 'module_12']然后进入python

>>>from package1.subPack1 import *>>>module_11.funcA()Traceback (most recent call last): File "", line 1, in ImportError: No module named module_11也就是说,以*导入时,package内的module是受__init__.py限制的。好了,最后来看看,如何在package内部互相调用。如果希望调用同一个package中的module,则直接import即可。也就是说,在module_12.py中,可以直接使用import module_11如果不在同一个package中,例如我们希望在module_21.py中调用module_11.py中的FuncA,则应该这样:from module_11包名.module_11 import

funcA

包机制

# a.py

def add_func(a,b):

return a+b

# b.py

from a import add_func # Also can be : import a

print ("Import add_func from module a")

print ("Result of 1 plus 2 is: ")

print (add_func(1,2)) # If using "import a" , then here should be "a.add_func"

module可以定义在包里面.Python定义包的方式稍微有点古怪,假设我们有一个parent文件夹,该文件夹有一个child子文件夹.child中有一个module

a.py . 如何让Python知道这个文件层次结构?很简单,每个目录都放一个名为_init_.py 的文件.该文件内容可以为空.这个层次结构如下所示:

parent --__init_.py

--child

-- __init_.py

--a.py

b.py那么Python如何找到我们定义的module?在标准包sys中,path属性记录了Python的包路径.你可以将之打印出来:

import sys

print(sys.path)通常我们可以将module的包路径放到环境变量PYTHONPATH中,该环境变量会自动添加到sys.path属性.另一种方便的方法是编程中直接指定我们的module路径到sys.path 中:importsysimportos

sys.path.append(os.getcwd()+'\\parent\\child')print(sys.path)fromaimportadd_funcprint(sys.path)print("Import add_func from module a")print("Result of 1 plus 2 is: ")print(add_func(1,2))知识点:

如何定义模块和包

如何将模块路径添加到系统路径,以便python找到它们

如何得到当前路径

Python 包的相对导入讲解

两个常见错误

1. ValueError: Attempted relative import in non-package​

错误重现

目录树

1

2

3

4

5

6

7

8

9case1/

├──cat

│├──__init__.py

│└──cat.py

├──dog

│├──__init__.py

│└──dog.py

└──main.py

代码

1

2

3

# case1/cat/cat.py

from..importdog

执行

python case1/cat/cat.py

错误原因

python 使用一个模块的属性 name 来决定他在包结构中的位置,所以当直接执行 cat.py 时,name = \’main\’,cat.py 被当作顶层模块来处理了,自然不可能导入上层的任何对象了。

2. ValueError: Attempted relative import beyond toplevel package

错误重现

目录树

1

2

3

4

5

6

7

8

9

10

11case2/

├──cat

│├──__init__.py

│├──cat.py

│└──cat.pyc

├──dog

│├──__init__.py

│└──dog.py

├──__init__.py

└──main.py

代码

1

2

3

4

5

6

# case2/cat/cat.py

from..importdog

# case2/main.py

importcat.cat

执行

python case2/main.py

错误原因:

这里的 case2 是一个包,但当你直接执行 main.py 的时候,就没有把完整的 case2 当作一个包来处理了,可想而知,下层的 cat.py 自然找不到上层包了。即想要相对导入成功,必须让下层的被导入对象是上层包或上层包内的对象。

正确执行的例子

目录树

1

2

3

4

5

6

7

8

9

10

11

12case3/

├──alpaca.py

├──main.py

└──pets

├──__init__.py

├──cat

│├──__init__.py

│└──cat.py

└──dog

├──__init__.py

└──dog.py

代码

1

2

3

4

5

6

7

# case3/pets/cat/cat.py

from..dogimportdog

from..importdog

# case3/main.py

frompets.catimportcat

执行

python case3/main.py

请注意,这里的 cat.py 中是不能导入 alpaca 的,因为 pets 已经是这个包树的顶层了。

另外一篇:

python的相对路径导入问题

用python做项目,如果项目大了,或者想更好的管理程序,总是要使用包。包解决了命名冲突的问题。

今天在使用python的相对路径导入的时候,遇到了不少的问题。

包导入情形:

1

2

3

4

5

6

7

8

9

10

11

src/

__init__.py

main.py

components/

__init__.py

expander.py

language_id.py

utilities/

__init__.py

functions.py

如果要在expander.py中引用functions.py中的内容,或许这样表示

from ..utilities import functions.py

1.错误一:ValueError:Attemptedrelative import beyond toplevel package

这个问题是因为到达了包的最顶层,而最顶层不是一个包。

解决方法:在main.py同级添加一个目录mod,包含components和utilities,并在mod中添加一个init.py,即可解决

参见:http://stackoverflow.com/questions/4175534/relative-imports-in-python

2.错误二:ValueError: Attempted relative import in non-package

使用相对路径进行导入的文件,不能再当作主文件执行。原因如下:

http://blog.csdn.net/chinaren0001/article/details/7338041

3.错误三:no module named ***

在指定路径下没有找到该模块。

另外:在main.py执行的时候,没有指定路径的文件默认与main.py是同一路径。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/394326.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

汽车之家的安全框架,是如何从0到1搭建的?

“别人家的安全”是安全威胁情报(微信ID:Threatbook)近期推出的一档专栏。 合规、管理、构建、应急……安全问题千千万,层出不穷。我们没办法给出这些问题的标准答案,但我们可以用Case Study的形式,让你看看…

leetcode264. 丑数 II

编写一个程序,找出第 n 个丑数。 丑数就是质因数只包含 2, 3, 5 的正整数。 示例: 输入: n 10 输出: 12 解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。 说明: 1 是丑数。 n 不超过1690。 解题思路 直接用treeset去重和排序 代码 class Solution …

vr多人_如何构建多人VR网络应用

vr多人by Srushtika Neelakantam通过Srushtika Neelakantam 如何构建多人VR网络应用 (How to build a multiplayer VR web app) In this article, we’ll learn about three great frameworks/libraries that allow any web developer to build a VR app that works on any de…

量子测量 -- 确定性的死神

一、测量 -- 确定性的死神 前文已反复提及在量子世界中测量这一过程会产生很多奇异的、反直觉的现象。在第一篇文章中我举的例子是:用同样的配方,同样的火候,同样的厨具(所有你能想到的变量均相同)煎鸡蛋,结…

python增删改查csv文件_Python--作业2--对员工信息文件,实现增删改查操作

#!/usr/bin/env python#-*- coding:utf-8 -*-#Author:Huanglinshengimportos#查询方式一:select * from data_staff.txt where age > 22#查询方式二:select * from data_staff.txt where dept "IT"#查询方式三:select * from d…

ios注销所有通知_您一直想了解的有关iOS中通知的所有信息

ios注销所有通知by Payal Gupta通过Payal Gupta 您一直想了解的有关iOS中通知的所有信息 (Everything you’ve always wanted to know about notifications in iOS) 漂亮的小警报..? (Pretty Little Alerts..?) Notifications are a way to inform users when new…

vue-x

https://my.oschina.net/wangnian/blog/2055631转载于:https://www.cnblogs.com/ylblogs/p/10694849.html

leetcode97. 交错字符串(动态规划)

给定三个字符串 s1, s2, s3, 验证 s3 是否是由 s1 和 s2 交错组成的。 示例 1: 输入: s1 “aabcc”, s2 “dbbca”, s3 “aadbbcbcac” 输出: true 解题思路 数组含义:dp[i][j]s1的前i个和s2的前j个能否组成字符串s3的前ij长度的子串 状态转移: d…

【LeetCode】19. Remove Nth Node From End of List

Given a linked list, remove the nth node from the end of list and return its head. For example, Given linked list: 1->2->3->4->5, and n 2.After removing the second node from the end, the linked list becomes 1->2->3->5.题意:…

《网络空间欺骗:构筑欺骗防御的科学基石》一1.1 主动网络空间防御中网络空间抵赖与欺骗的视图...

1.1 主动网络空间防御中网络空间抵赖与欺骗的视图 本文讲的是网络空间欺骗:构筑欺骗防御的科学基石一1.1 主动网络空间防御中网络空间抵赖与欺骗的视图,将抵赖与欺骗纳入标准操作规程(SOP):随着攻击技术的不断演进,网…

管桩的弹性模量计算公式_桩基设计计算公式

0.9300.71555.31201018001.130973355桩长21.3mN(KN)φfc(kN/m2)Ap(m2)f’s(kN/m2)A’s(m2)桩直径(m2)11518.963620.7119001.1309733553000000.0160849541.2标准值19006.29KN单桩承载力设计计算(建筑桩基技术规范08版)根据《建筑桩基技术规范》(JGJ94—2008), 单桩竖向极限承载力…

python函数的作用降低编程复杂度_Python语言程序设计 (第11期) 测验5: 函数和代码复用...

共10道单选题和2道编程题,限答1次、限时50分钟选择题1.以下选项不是函数作用的是:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫…

restful解决什么问题_当您陷入RESTful,WordPress和一个困难的地方时,如何解决CMS问题...

restful解决什么问题by Jessica Duffin Wolfe杰西卡达芬沃尔夫(Jessica Duffin Wolfe) 当您陷入RESTful,WordPress和一个困难的地方时,如何解决CMS问题 (How to solve a CMS problem when you’re caught between RESTful, WordPress, and a hard place…

InfluxDB的HTTP API写入操作

一、说明 为了方便,本文主要使用curl来发起http请求,示例当中也是使用curl这个工具来模拟HTTP 请求。 在实际使用中,可以将请求写入代码中,通过其他编程语言来模拟HTTP请求。 二、InfluxDB通过HTTP API操作数据库 1)建…

揭开勒索软件的真面目

一、前言 2013年9月,戴尔公司的SecureWorks威胁应对部门(CTU)发现了一种名为“CryptoLocker”的勒索软件,它以邮件附件形式分发,感染计算机并加密近百种格式文件(包括电子表格、数据库、图片等)…

leetcode486. 预测赢家(动态规划)

给定一个表示分数的非负整数数组。 玩家1从数组任意一端拿取一个分数,随后玩家2继续从剩余数组任意一端拿取分数,然后玩家1拿,……。每次一个玩家只能拿取一个分数,分数被拿取之后不再可取。直到没有剩余分数可取时游戏结束。最终…

w550官方例程_急!求索爱w550的刷机所需要的所有文件! 全部分送上!

展开全部W550c行货软件升级使用国内行货W550c手机的朋友,将来是可以在62616964757a686964616fe58685e5aeb931333238646330官方网站使用随机数据线免费升级的,目前W550c的最新版本是R4AB048但是由于目前官方网站还未提供,大家敬请期待。W550c索…

python的xpath用法介绍_python爬虫之xpath的基本使用详解

本篇文章主要介绍了python爬虫之xpath的基本使用详解,现在分享给大家,也给大家做个参考。一起过来看看吧一、简介XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。XPath 是 W3C XSLT 标准的主要元素&#xff…

杨波 微服务技术专家_专家称,这些是最有效的微服务测试策略

杨波 微服务技术专家by Jake Lumetta杰克卢米塔(Jake Lumetta) 专家称,这些是最有效的微服务测试策略 (These are the most effective microservice testing strategies, according to the experts) Testing microservices is hard. More specifically, end-to-end…

LRU算法实现

LRU是Last Recent Used 缩写,做为一种缓存算法,将最近较少使用的缓存失效。memcache采用了该算法。如下采用了一种PHP的实现方式。该算法将每次新增的内容,放到缓存顶部,达到缓存极限时,将缓存底部的内容清除。可以通过…