import自己的python包(package) | 常见import方式及问题解决

问题:在import自己写的package时,总会出现没有module存在的错误!

解决

(1)import方式不正确导致的错误

方式一:import
在这里插入图片描述

以上述Cars 这个package以及相应sub package是自己构建的包。要使它们成为一个包,它们都必须包含__init__.py文件,该文件可以是空白的,或者带有一些初始化代码。让我们假设汽车的所有模型都是模块。使用包有助于单独或整体导入任何模块。

假设我们想得到Bmw i8。其语法如下:

import Cars.Bmw.x5 

当导入一个包或子包或模块时,Python搜索整个目录树来寻找特定的包,并按照点运算符.的编程进行系统化处理。

如果任何模块包含一个函数,我们想导入它。例如,a8有一个函数get_buy(1),我们想导入它,语法如下:

import Cars.Audi.a8
Cars.Audi.a8.get_buy(1)

虽然只使用import语法,但必须记住最后一个属性必须是子包或模块,它不应该是任何函数或类名

方式二:from ... import

如果按照第一种方式的import,无论何时我们需要使用里面的函数,我们都需要在导入父包之后写下一整行。为了以更简单的方式解决这个问题,我们使用了from关键字。

from Cars.Audi import a8

现在,我们可以在任何地方用以下方式调用函数

a8.get_buy(1)

还有另一种方式,不那么冗长。我们可以直接导入函数,并在需要的地方使用它。首先使用导入:

from Cars.Audi.a8 import get_buy

现在,我们可以在任何地方用以下方式调用函数

get_buy(1)

当使用from…import *语法时,我们可以将子模块中的任何内容导入到类、函数或变量中,这些都在同一个模块中定义。如果在导入部分提到的属性没有在包中定义,那么编译器抛出一个ImportError异常。
显式地导入子模块时,导入子模块可能会导致不必要的副作用。因此,我们可以使用from…import *语法一次性导入各种模块。语法是:

from Cars.Chevrolet import *

(2)路径不对导致的错误

pyroxene_processor是自己写好的package,放置在code_packaging的目录下。
在这里插入图片描述
以下是pyroxene_processor里的文件

在这里插入图片描述
在terminal终端的code_packageing目录下使用python3交互式解释器:
在这里插入图片描述
使用import pyroxene_processor.processor调用包时,发生以下错误:
在这里插入图片描述
因为global_variable.py文件与processor.py文件处于同一目录下,前者是用于存储全局变量的文件,后者是装有函数的文件。在processor.py中,需要调用到global_variable.py中的全局变量:
在这里插入图片描述
如果仅在processor.py中使用from global_variable import *是不够的,因为交互式的python3解析式是在与包pyroxene_processor相同目录下运行的,当前的工作路径是:
在这里插入图片描述

在当前工作路径下使用import时,任何调用包pyroxene_processor下第一级目录的文件时,都需要加上pyroxene_processor,其中processor.pyglobal_varible.py都位于第一级目录下,因此调用时,需要使用import pyroxene_processor.processorimport pyroxene_processor.global_varible

在这里插入图片描述

这样,重新在code_packaging目录下启动python3解释器,调用封装好的包,即可成功运行.

在这里插入图片描述

部分内容翻译自GeeksforGeeks的Create and Access a Python Package

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值