pycharm导入jieba包_Python中导入完整指南:绝对、相对等(1)

c47b84c4e9dc233402cef933583e7b11.png

如何规划你的代码,使导入简洁和清晰

导入不仅仅是使用外部库的问题,它还允许你保持代码的简洁和有组织。在本教程中,我们将讨论从最基本的导入到复杂的主题,比如对包中模块的延迟加载。你可以直接跳到最让你感兴趣的部分。

导入介绍

在Python中,每当你想要导入一个模块时,你都要执行以下操作:

2e4fb6fd6faa7cdb0c47e792a35134f6.png

在这个情况中,sys是一个Python标准库,它提供了与解释器本身进行交互的函数。Python为不同的任务提供了大量的库。你可以在这里找到他们。如果你想使用这个模块中定义的函数,你只需要简单地执行:

a06611f58bf3ebcd682ba2680a181fe9.png

这将终止你的Python会话。sys可以做的事情比仅仅退出解释器要多得多。它还可以告诉你是否正在运行一个带有一些参数的脚本。例如,你可以将以下内容写入文件test_argv.py:

6ac9308b40490535fd5b45aa0c59da4f.png

现在,你可以运行该文件,看看输出是什么:

8c9fc268e6ae97e0a8ce0b810739c130.png

导入整个sys模块可能不是我们想要的,因为我们只使用它的一个函数。在这种情况下,我们也可以选择我们想要导入的内容:

c5344a64155458177fb3b688281a4a1c.png

输出是一样的。理解什么时候使用完整的导入或者什么时候只选择需要的导入,在很大程度上取决于你的个人偏好、你想要实现什么,以及库需要什么。

导入 *

在上面的例子中,我们已经看到我们只从sys中导入了一个模块。如果我们想要导入更多的模块,我们可以在同一行中指定它们,例如:

fca5c020473024b3e5e584cdd8072556.png

你可以导入任意数量的包。为了避免行变得太长,通常的做法是将它们垂直堆叠。例如,你可以像这样:

52b7e715cc5edc0d400ec45e222e9159.png

注意使用(,)来创建一个清晰的导入列表。可以想象,如果你需要从一个包中导入很多模块,那么列出你所需的所有模块就会变得很麻烦。因此,你可能希望一次性导入所有可用的模块。Python允许你这样做来实现它:

e2d4d8d3a37207cdf96b502daadc6f1c.png

然而,这是一个非常不鼓励的做法。由于你导入的模块没有控制,所以有些函数可能会被覆盖。让我们通过下面的例子来看一下:

6bb02a6f8c8da8215db06419a5e5852b.png

也许你已经意识到,time有一个名为sleep的函数,它会在给定的秒数内暂停程序的执行。如果你像下面这样编写和运行一个脚本:

131266b19b13323d587a9e13a04089a6.png

你会注意到“Here”和“After”这两行之间没有延迟。这里发生的是,time和asyncio都定义了一个行为方式非常不同的函数sleep。你需要记住大量的知识才能理解正在发生的事情,所以大多数开发人员在导入时都避免使用*。

time和asyncio的情况比较特殊,因为它们都属于标准Python库。当你开始使用别人定义的库时,有时你很难知道并记住所有定义的模块和函数。此外,有些名称非常方便(比如sleep),你可能会在不同的包中发现它们的定义。

除非你确切地知道你需要导入什么以及为什么要导入*,否则使用我们在文章中看到的第一个语法是非常明智的:

e7160c275bd1731f5988626c475bcb30.png

现在,即使你以前没有使用过asyncio库,你也可以确切地知道发生了什么。当我们讨论导入模块时,我们将会更加清楚Python导入机制的工作方式。

导入为…

在导入模块时,有时我们会发现自己处于这样一种情况:两个包定义了同名的不同函数。都定义了sleep的time和asyncio就是这种情况。为了在导入时避免这种名称冲突,Python允许我们更改导入内容的名称。我们可以这样做:

a36f4c6fe0eb42869f1fdf6319eb6325.png

通过这种方式,我们可以使用来自time或者asyncio的sleep并避免名称冲突。这样做,我们只导入我们想要的模块,而不是整个包,但是仍然保持我们的选择的灵活性。

上面的例子只是import as很方便的一种情况。如果你习惯于使用Python绘制图表,那么你可能会遇到这样的行:

7d921874dded4d68de60ca67cd17152d.png

以上三行在许多科学项目中是普遍存在的。它们是如此常见,以至于Pycharm等编辑器如果看到包含np…之类内容的行,就会建议你导入numpy。在上面的示例中,import as的导入不是为了防止名称冲突,而是为了使记号更方便一些。代替输入以下内容:

0e6ec78398684e637653c56515b98f10.png

你只需简单地输入:

d1be851ef88e88551584e976b8ed23c6.png

不同的包有不同的快捷方式。例如,PyQtGraph通常被缩写为pg,当然不同的字段使用不同的缩写。将Numpy作为np或Pandas作为pd导入不是强制性的。然而,由于社区是这样做的,它将使你的代码更具可读性。

备注

如果你浏览StackOverflow,你会经常看到,numpy被导入的那一行被省略了,你只看到np的使用。

导入你的代码

到目前为止,我们已经看到了如何导入其他人开发的包和模块。然而,导入是一个很好的工具,它可以将代码的不同部分结构化到不同的文件中,使其更易于维护。因此,你迟早会发现自己需要导入你自己的代码。让我们从简单的开始,并逐步增加复杂性。让我们在一个名为first.py的文件中放置以下代码:

3549c13c1d6970897ddacfac42746f53.png

在另一个文件中,我们称它为second.py,我们输入以下代码:

0d8c9ed29b24543b4d9086aae25a0ee1.png

你可以运行它:

695984c002986928242c18cf29928dac.png

这很简单。你在一个文件中定义了一个函数,但在另一个文件中使用了该函数。请记住,我们在前面几节中讨论的内容仍然适用。例如,你可以from first import first_function as ff。只有脚本只是一个开始。有时,你还会将代码组织到文件夹中。让我们创建一个名为module_a的文件夹,其中有一个名为third.py的新文件。那么,该文件夹的结构是这样的:

82695bae43187b2f3f32256ab2d441e4.png

让我们在third中添加一个新函数。请记住这些例子,它们是非常基础的,是为了不丢失重要的概念:

72bbcfea3e72f8dab3ef72fff40dccb8.png

现在,让我们编辑second.py来导入这个新函数:

97f7dee85ba632ac8f186caaffc0fcba.png

如果你像以前一样运行它,你将得到以下输出:

537c8201a0b5265e357139a7eb532504.png

注意我们用来导入third_function的记号。我们指定了文件夹,在本例中是module_a,然后我们用点:..来引用此文件。最后我,们得到了module_a.third,并且去除了.py。这已经允许你大量改进你的代码及其结构,但这只是冰山一角。

有时,当你开始安装库时,它们具有依赖项,你会很容易丢失所安装的每个包的踪迹。让我们看一个非常简单的例子。我假设你已经安装了numpy(但是,下面的示例将使用几个包)。创建一个名为numpy的新文件夹,其中有一个名为sleep.py的文件。文件夹结构最终看起来会像这样:

fda5ebb04589e58abf9a71c53cc8ad17.png

在文件sleep.py中,编写以下代码行:

c51d773da65ee5b9eafc7880c27d9014.png

这是一个非常简单的例子。现在我们可以使用我们的新函数sleep来更新second.py了:

154be97665b98ac8ab9dd163b57f01a4.png

现在的主要问题是,Python如何知道它应该导入你刚刚定义的sleep,而不是真正的numpy中的模块呢?如果你继续并运行代码,你应该会得到以下错误:

2e8f3645dd8d4c1d4f3cb745f654ae80.png

这个异常是完全难以理解的。它告诉你Python试图在numpy包中寻找一个名为sleep的模块,而不是在我们的文件夹中。这个问题的快速解决方案是在numpy文件夹中创建一个名为__init__.py的空文件:

8882049d61b6472387ae0f3ab5770786.png

如果你再次运行代码,你不会看到任何问题:

e54dab0b19741d7ad4e8a6022be03497.png

要解释发生了什么,你需要了解Python是如何在你的计算机上查找包的。这个主题很复杂,而且Python允许你进行大量的自定义。一旦你有了经验,官方文档就会让你对这件事有所了解。简而言之,Python将首先查看你要导入的内容是否属于标准库。这意味着,如果我们调用的是文件夹time而不是numpy,那么行为就会有所不同。

如果Python没有在其标准库中找到该模块,它将检查外部模块。这个操作也是以一种非常特殊的顺序进行的。它将首先在当前目录中进行搜索,然后移动到包安装的目录(例如,当你执行pip install numpy时)。因此,我们可以扪心自问,为什么在第一个例子中它不起作用,而在第二个例子中,在添加了空的__init__.py之后,它就起作用了呢?

要让Python认识到一个目录是一个模块,也该目录必须包含一个__init_ .py文件。这样做是为了防止意外的名称冲突,比如我们的示例中numpy发生的情况。假设你开始开发另一个需要使用numpy的程序。你如何确定你将导入正确的numpy而不是我们刚刚开发的那个?Python允许你检查它将查找哪些目录来导入:

945c1999377ac47e8ab5115d6da381a6.png

上面的代码将列出属于该路径的所有目录。你可能会看到一个包含4个或6个文件夹的列表,其中大多数都是非常有逻辑的:Python安装的地方,你的虚拟环境文件夹等等。

将目录添加到路径(Path)

人们可以问的下一个逻辑问题是,Python查找模块的路径是否可以修改,答案是肯定的。第一个选项是在运行时修改它。你可以很容易地将一个目录附加到变量sys.path。一个比较常见的做法是将当前目录添加到路径列表中:

677fe70a9f90db6d51e56312a95910f0.png

如果你浏览一下上面的代码,你会发现它们都很简单。你可以添加任何你想要的路径,不一定是当前目录。这种方法的优点之一是,你只会在程序运行时修改系统路径。如果你运行了两个不同的程序,每个程序都有自己的路径。

另一个选项是修改PYTHONPATH环境变量。环境变量在每个操作系统上都是可用的,惟一的区别是你如何设置和修改它们。许多程序都是这样设计的:你可以通过设置一些全局变量来修改它们的行为,这些全局变量由操作系统本身存储和处理。

如果你是在Linux或Mac上,设置这些变量的命令是export,你将执行以下操作:

7ebcb703f1d052e5af07b50b7add282f.png

第一行将文件夹/home/user附加到变量PYTHONPATH。注意,我们使用了:作为一个目录分隔符。

如果你是在Windows上,你需要右键点击“电脑”,选择“属性”。在“环境变量”选项中选择“高级系统设置”。如果PYTHONPATH存在,你可以修改它,如果它不存在,你可以点击“新建”来创建它。记住,在Windows上,你必须使用;来分隔目录,因为:是文件夹路径的一部分(例如:C:\Users\Test\…)。

一旦你修改了你的Python Path,你可以运行以下代码:

7893780b413caeefb6955f326b5ef652.png

你将看到/home/user出现在目录列表的顶部。你可以添加另一个目录,例如:

834530511867dd7aa7408a2ac045ddbe.png

你会看到它也会出现。向Python Path中添加信息是在你自己的计算机上开发一个结构的好方法,通过将代码放在不同的文件夹中等等。它也会变得难以维护。作为一个快速说明,Python允许你在运行时读取环境变量:

e05c4e0b2528ea18acd6e0504c71e5eb.png

注意,在Windows上,对环境变量的更改是永久性的,但是在Linux和Mac上,如果你希望保留这些变量,则需要执行额外的步骤。

PYTHONPATH和虚拟环境

当你使用虚拟环境时,有一个非常方便的技巧,即在激活或停用环境变量时修改它们。这在Linux和Mac上是无缝的,但是Windows用户可能需要一些修改来适应下面的例子。

例如,如果你查看activate脚本(位于文件夹venv/bin中),你可以得到关于如何处理PATH变量的灵感。第一步是存储旧变量,在修改它之前,然后添加我们想要的任何东西。当我们停用虚拟环境时,我们将旧变量设置回来。

虚拟环境有三个钩子来确切地实现这一点。在activate脚本旁边,你将看到另外三个文件,分别是postactivate、postdeactivate和predeactivate。让我们修改一下postactivate,如果你以前从未使用过它,那么它应该是空的。添加以下内容:

cf1cd746ae56ae2a7e9c1cc778e5734f.png

在下次激活虚拟环境时,你将把目录/home/user添加到PYTHONPATH中。在停用你的环境之后,返回到python路径的原始版本是一个很好的做法。你可以通过编辑predeactivate文件来实现:

672ace3861c9d6f723a40c395fdee056.png

这样,我们将变量设置为激活之前的状态,并删除我们创建的额外变量。注意,如果你不停用该环境,而只是关闭终端,那么对PYTHONPATH的更改将不会被保存。如果你从一个环境切换到另一个环境并一直使用相同的终端,那么predeactivate脚本非常重要。

PYTHONPATH 和 PyCharm

如果你是PyCharm的用户,并且周围的大多数IDE可能与你的类似,那么你可以在此程序中直接更改环境变量。如果你打开Run菜单,并选择Edit Configurations,你会看到以下菜单:

9598d53932c634a7bdbb01526f4c1f62.png

在这些选项之间,你可以看到,例如,“将内容根目录添加到PYTHONPATH”。这就是在Pycharm中导入可以开箱即用的原因,但是如果你直接从终端运行相同的代码,可能会出现一些问题。如果你点击右边写着“环境变量”的小图标,你也可以编辑环境变量。

从长远来看,关注环境变量可以避免问题。例如,特别是如果两个开发人员共享一台计算机(这在实验室中是很常见的情况),并在PC上控制实验,那么,软件会被多个用户编辑。也许一个人会将环境变量设置为指向某个特定的路径,而这并不是第二个人所期望的。

英文原文:https://www.pythonforthelab.com/blog/complete-guide-to-imports-in-python-absolute-relative-and-more/ 
译者:一瞬

1657cb8622220a3e3b66e0e7c2f1673b.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值