问题:在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.py
和global_varible.py
都位于第一级目录下,因此调用时,需要使用import pyroxene_processor.processor
和import pyroxene_processor.global_varible
。
这样,重新在code_packaging
目录下启动python3解释器,调用封装好的包,即可成功运行.
部分内容翻译自GeeksforGeeks的Create and Access a Python Package。