Python - 模块与包
<h2>前言</h2><p>如果你在 51 Testting 上面见到这篇文章,不要以为我是盗版哦!因为那是我投稿的文章</p>
<p> </p>
<h2>模块和包的定义</h2>
<p><img src="https://img2020.cnblogs.com/blog/1896874/202006/1896874-20200609174133687-138417112.png" alt="" loading="lazy"></p>
<p><strong>模块的定义:</strong>任何 <span class="cnblogs_code">*.py</span> 的文件都可以当作模块使用 <span class="cnblogs_code">import</span> 导入</p>
<p><strong>包的定义:</strong>包含一个__init__.py和其他模块、其他子包的一个目录</p>
<p>实际项目中,所谓的包和模块分别代表什么,如下:</p>
<p>包就是指 <span class="cnblogs_code">test</span> </p>
<p>模块就是 <span class="cnblogs_code">do_excel.py</span> , <span class="cnblogs_code">http_request.py</span> , <span class="cnblogs_code">run.py</span> </p>
<p> </p>
<h2>导入包的各种方法</h2>
<p><img src="https://img2020.cnblogs.com/blog/1896874/202006/1896874-20200609174140561-1089904571.png" alt="" loading="lazy"></p>
<p>我们以上面这个目录讲解,在 <span class="cnblogs_code">run.py</span> 文件中导入各个包的方式</p>
<p> </p>
<h3>导入单个test包</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">import</span> test</pre>
</div>
<h3>导入report、log包</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 同时导入,用逗号隔开,墙裂推荐</span>
<span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> report, log
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 分开导入</span>
<span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> report
</span><span style="color: rgba(0, 0, 255, 1)">import</span> log</pre>
</div>
<p> </p>
<h3>导入单个test包,并起别名</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">import</span> test as t</pre>
</div>
<h3>导入report、log包,并都起别名</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">import</span> report as r, log as l</pre>
</div>
<p> </p>
<h3>导入project包下的old包</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">import</span> project.old</pre>
</div>
<h3>导入project包下的old包下的test包</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 方式一:链式调用</span>
<span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> project.old.test
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 方式二:from .. import ..</span>
<span style="color: rgba(0, 0, 255, 1)">from</span> project.old <span style="color: rgba(0, 0, 255, 1)">import</span> test</pre>
</div>
<p> </p>
<h3><span style="color: rgba(210, 44, 74, 1)">到这里先总结下知识点</span></h3>
<p><strong>import后面跟的包名也是单位变量名(自己取的方便理解)</strong></p>
<p>什么意思?以上面old包下的test包举例</p>
<p><strong>场景:</strong>假设我要调用test包下的 <span class="cnblogs_code">test.py</span> 里面的 <span class="cnblogs_code">run()</span> 方法</p>
<p>如果用的是方式一,就得这样写</p>
<div class="cnblogs_code">
<pre>project.old.test.test.run()</pre>
</div>
<p>而方式二,则是这样写</p>
<div class="cnblogs_code">
<pre>test.test.run()</pre>
</div>
<p> 可以看到import后面跟什么<span style="color: rgba(210, 44, 74, 1)">“变量”</span>,当你要调用包、模块里面的东西时,你就得先写<span style="color: rgba(210, 44, 74, 1)">“变量”</span>再调用包名、模块名</p>
<p> </p>
<p><strong><span style="color: rgba(210, 44, 74, 1)">我们可以再来看看下面的总结</span></strong></p>
<ul>
<li>import:完全导入</li>
<li>from .. import ..:部分导入(针对性导入)</li>
</ul>
<p>怎么区分它们的意思捏?我们来看看哈;在根目录下的 <span class="cnblogs_code">test</span> 包下的 <span class="cnblogs_code">run.py</span> 代码如下</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">!/usr/bin/env python</span><span style="color: rgba(0, 128, 0, 1)">
#</span><span style="color: rgba(0, 128, 0, 1)"> -*- coding: utf-8 -*-</span>
<span style="color: rgba(0, 0, 0, 1)">
num </span>=1<span style="color: rgba(0, 0, 0, 1)">
floats </span>= 2.22<span style="color: rgba(0, 0, 0, 1)">
strs </span>= <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">字符串</span><span style="color: rgba(128, 0, 0, 1)">"</span>
<span style="color: rgba(0, 0, 255, 1)">def</span><span style="color: rgba(0, 0, 0, 1)"> sum():
</span><span style="color: rgba(0, 0, 255, 1)">print</span>(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">我是sum</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> test():
</span><span style="color: rgba(0, 0, 255, 1)">def</span><span style="color: rgba(0, 0, 0, 1)"> test(self):
</span><span style="color: rgba(0, 0, 255, 1)">print</span>(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">test class</span><span style="color: rgba(128, 0, 0, 1)">"</span>)</pre>
</div>
<p>假设,在项目中其他文件中想调用 <span class="cnblogs_code">run.py</span> 下的变量、函数名、类名</p>
<p> </p>
<h2>导入其他模块的变量、函数名、类名</h2>
<h3>方式一:import方式</h3>
<p>导入的是 <span class="cnblogs_code">run</span> 模块里面所有内容(包括变量、函数、类名),但是还是得通过 <span class="cnblogs_code">test.run</span> 去链式调用</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> test.run
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 调用num变量</span>
<span style="color: rgba(0, 0, 255, 1)">print</span>(test.run.num)<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 输出1</span>
<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 调用sum方法</span>
<span style="color: rgba(0, 0, 255, 1)">print</span>(test.run.sum())<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 输出 我是sum</span></pre>
</div>
<p>有些小伙伴就想问,难道我不能指定变量、函数名、类名吗?让我们来试试</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">!/usr/bin/env python</span><span style="color: rgba(0, 128, 0, 1)">
#</span><span style="color: rgba(0, 128, 0, 1)"> -*- coding: utf-8 -*-</span>
<span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> test.run.num
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 调用num变量</span>
<span style="color: rgba(0, 0, 255, 1)">print</span>(test.run.num) </pre>
</div>
<p>首先,如果你用的是Pycharm,在import最后的num会报黄,hover上去会提有提示 <span class="cnblogs_code">No module named num </span> </p>
<p>然后,运行下文件会报错如下</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">Traceback (most recent call last):
File </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">F:/test/tests.py</span><span style="color: rgba(128, 0, 0, 1)">"</span>, line 5, <span style="color: rgba(0, 0, 255, 1)">in</span> <module>
<span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> test.run.num,test.run.floats
ModuleNotFoundError: No module named </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">test.run.num</span><span style="color: rgba(128, 0, 0, 1)">'</span>; <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">test.run</span><span style="color: rgba(128, 0, 0, 1)">'</span> <span style="color: rgba(0, 0, 255, 1)">is</span> <span style="color: rgba(0, 0, 255, 1)">not</span> a package</pre>
</div>
<p>错误的大概意思就是: <span style="color: rgba(210, 44, 74, 1)"><span class="cnblogs_code">test.run.num</span> 不是一个模块名, <span class="cnblogs_code">test.run</span> 不是一个</span>包</p>
<p>可以看到import的完全导入意思就是:<span style="color: rgba(210, 44, 74, 1)">导入最小单位是模块,而不是变量、函数名、类名</span></p>
<p> </p>
<h3>方式二:from .. import ..</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> from 包名.模块名 import 变量/函数/类名</span>
<span style="color: rgba(0, 0, 255, 1)">from</span> test.run <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> num
</span><span style="color: rgba(0, 0, 255, 1)">from</span> test.run <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> sum
</span><span style="color: rgba(0, 0, 255, 1)">from</span> test.run <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> testss
</span><span style="color: rgba(0, 0, 255, 1)">from</span> test.run <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> floats
</span><span style="color: rgba(0, 0, 255, 1)">if</span> <span style="color: rgba(128, 0, 128, 1)">__name__</span> == <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">__main__</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">:
</span><span style="color: rgba(0, 0, 255, 1)">print</span><span style="color: rgba(0, 0, 0, 1)">(num)
</span><span style="color: rgba(0, 0, 255, 1)">print</span><span style="color: rgba(0, 0, 0, 1)">(sum())
</span><span style="color: rgba(0, 0, 255, 1)">print</span><span style="color: rgba(0, 0, 0, 1)">(testss().test())
</span><span style="color: rgba(0, 0, 255, 1)">print</span>(floats)</pre>
</div>
<h3>执行结果</h3>
<div class="cnblogs_code">
<pre>1<span style="color: rgba(0, 0, 0, 1)">
我是sum
test </span><span style="color: rgba(0, 0, 255, 1)">class</span>
2.22</pre>
</div>
<p>可以看到from .. import .. 的部分导入意思就是:<span style="color: rgba(210, 44, 74, 1)">导入最小单位可以是模块,也可以是变量、函数名、类名</span></p>
<p> </p>
<h2>导入模块的方法</h2>
<p>根据上面讲的知识,如果要导入模块有两种方式,一个就是 <span class="cnblogs_code"><span style="color: rgba(0, 0, 255, 1)">import 模块名</span></span> 一个就是 <span class="cnblogs_code"><span style="color: rgba(0, 0, 255, 1)">from 包名</span> <span style="color: rgba(0, 0, 255, 1)">import 模块名</span></span> </p>
<p> </p>
<h3>导入test包下的run模块</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> import</span>
<span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> test.run
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> from</span>
<span style="color: rgba(0, 0, 255, 1)">from</span> run <span style="color: rgba(0, 0, 255, 1)">import</span> test</pre>
</div>
<p> </p>
<h3>导入test包下的run、tests模块</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> import</span>
<span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> test.run,test.tests
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> from</span>
<span style="color: rgba(0, 0, 255, 1)">from</span> run <span style="color: rgba(0, 0, 255, 1)">import</span> test,tests</pre>
</div>
<p> </p>
<h2>特别知识</h2>
<p><span style="font-size: 16px"><strong><span style="color: rgba(210, 44, 74, 1)">提问:</span>import 包/模块,包和模块是从哪里导入的?</strong></span></p>
<p><span style="font-size: 16px"><strong><span style="color: rgba(210, 44, 74, 1)">回答:</span>我们是通过 <span class="cnblogs_code">sys.path</span> 所包含的路径列表你下,按<span style="color: rgba(210, 44, 74, 1)">顺序</span>查找的</strong></span></p>
<p> </p>
<p><span style="font-size: 16px"><strong>怎么理解?</strong></span></p>
<p>在Pycharm工程下敲以下代码</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> sys
</span><span style="color: rgba(0, 0, 255, 1)">print</span>(sys.path)</pre>
</div>
<p> </p>
<p>执行结果</p>
<div class="cnblogs_code">
<pre>[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">F:\\moocInterface\\test</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">F:\\moocInterface</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">D:\\PyCharm 2019.3.1\\plugins\\python\\helpers\\pycharm_display</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">D:\\python3.6\\python36.zip</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">D:\\python3.6\\DLLs</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">D:\\python3.6\\lib</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">D:\\python3.6</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">D:\\python3.6\\lib\\site-packages</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">D:\\python3.6\\lib\\site-packages\\django-2.1.5-py3.6.egg</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">D:\\python3.6\\lib\\site-packages\\pytz-2018.9-py3.6.egg</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">D:\\PyCharm 2019.3.1\\plugins\\python\\helpers\\pycharm_matplotlib_backend</span><span style="color: rgba(128, 0, 0, 1)">'</span>]</pre>
</div>
<p> </p>
<p> 可以看到:</p>
<ol>
<li>当前文件所在路径是放在第一位</li>
<li>工程路径放在第二位</li>
<li>Pycharm相关路径放在第三位</li>
</ol>
<p>我们从系统cmd进入Python解释器敲以下代码,查看结果</p>
<div class="cnblogs_code">
<pre>>>> <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> sys
</span>>>> <span style="color: rgba(0, 0, 255, 1)">print</span>(sys.path)</pre>
</div>
<p> </p>
<p>结果如下</p>
<div class="cnblogs_code">
<pre>[<span style="color: rgba(128, 0, 0, 1)">''</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">D:\\python3.6\\python36.zip</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">D:\\python3.6\\DLLs</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">D:\\python3.6\\lib</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">D:\\python3.6</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">D:\\python3.6\\lib\\site-packages</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">D:\\python3.6\\lib\\site-packages\\django-2.1.5-py3.6.egg</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">D:\\python3.6\\lib\\site-packages\\pytz-2018.9-py3.6.egg</span><span style="color: rgba(128, 0, 0, 1)">'</span>]</pre>
</div>
<p> </p>
<p><span style="color: rgba(210, 44, 74, 1)"><strong>结论:</strong></span></p>
<p>我们在Pycharm下import的包、模块,优先会在工程目录下寻找,找不到才会从Python默认安装路径下找</p>
<p> </p><br><br>
来源:https://www.cnblogs.com/poloyy/p/12489834.html
頁:
[1]