详解python关于多级包之间的引用问题

作者:西西嘛呦 时间:2021-04-16 19:58:17 

首先得明确包和模块。

  • 包:在一个目录下存在__init__.py,那么该目录就是一个包。

  • 模块:一个.py文件就是一个模块。

我们可以通过from 包 import 模块来引入python文件,也可以使用from 包.模块 import 模块中的函数或类。

具体看一下例子。
假设我们现在有以下的目录:

详解python关于多级包之间的引用问题

我们想在main.py中使用package_a和package_b里面额模块,可以这么使用:


from package_a import tmp2
from package_b import tmp4

tmp2.test_aTmp2()
tmp4.test_bTmp4()

test_aTmp2()和test_bTmp4()是tmp2.py和tmp4.py里面的函数。

  • 这里是package_a包中tmp2模块下的test_aTmp2函数

  • 这里是package_b包中tmp4模块下的test_bTmp4函数

假设我们想在main.py中使用a_utils包下的aUtils模块和b_utils包下的bUtils模块,我们可以这样:


from package_a import tmp2
from package_b import tmp4
from package_b.b_utils.bUtils import test_bUtils
from package_a.a_utils import aUtils

tmp2.test_aTmp2()
tmp4.test_bTmp4()
aUtils.test_aUtils()
test_bUtils()

注意这里的两种用法,

  • 一种是我们直接通过:from 包.包.模块 import 函数

  • 另一种是from 包.包 import 模块,并通过 模块.函数 来使用相关的函数。

这里是package_a包中tmp2模块下的test_aTmp2函数
这里是package_b包中tmp4模块下的test_bTmp4函数
这里是package_a包中a_uitls包中的aUtils模块下的test_aUitls函数
这里是package_b包中b_uitls包中的bUtils模块下的test_buitls函数

下一个,假设我们想在tmp4.py使用tmp3.py中的函数,因为在同一个包下,我们自然的是这么使用:


from tmp3 import test_bTmp3
test_bTmps3()

def test_bTmp4():
   print('这里是package_b包中tmp4模块下的test_bTmp4函数')

我们在tmp4.py中继续使用b_uitls包下的bUtils.py。


from tmp3 import test_bTmp3
from b_utils.bUtils import test_bUtils

def test_bTmp4():
   print('这里是package_b包中tmp4模块下的test_bTmp4函数')

# test_bUtils()
test_bTmp3()
test_bUtils()

这里是package_b包中tmp3模块下的test_bTmp3函数
这里是package_b包中b_uitls包中的bUtils模块下的test_buitls函数
现在的tmp4.py里面是以上那样,假设我们现在重新运行之前的main.py:


from package_a import tmp2
from package_b import tmp4
from package_b.b_utils.bUtils import test_bUtils
from package_a.a_utils import aUtils

tmp2.test_aTmp2()
tmp4.test_bTmp4()
aUtils.test_aUtils()
test_bUtils()

你会发现报错了:

Traceback (most recent call last):
  File "C:/Users/龚鸥波/Desktop/test_import/main.py", line 2, in <module>
    from package_b import tmp4
  File "C:\Users\龚鸥波\Desktop\test_import\package_b\tmp4.py", line 8, in <module>
    from tmp3 import test_bTmp3
ModuleNotFoundError: No module named 'tmp3'

我们在main.py里面导入了tmp4,tmp4里面调用了tmp3,我门运行tmp4.py是没问题,运行main.py有问题。这是因为,相对于main.py所在的目录,tmp3所在是在包package_b下面,在tmp4中就不能直接导入,可以改写成以下方式:


from .tmp3 import test_bTmp3
from .b_utils.bUtils import test_bUtils

def test_bTmp4():
   print('这里是package_b包中tmp4模块下的test_bTmp4函数')

test_bTmp3()
test_bUtils()

这样就不会报错了:

这里是package_b包中tmp3模块下的test_bTmp3函数
这里是package_b包中b_uitls包中的bUtils模块下的test_buitls函数
这里是package_a包中tmp2模块下的test_aTmp2函数
这里是package_b包中tmp4模块下的test_bTmp4函数
这里是package_a包中a_uitls包中的aUtils模块下的test_aUitls函数
这里是package_b包中b_uitls包中的bUtils模块下的test_buitls函数

但是这时我们去重新运行tmp4.py,发现会报错了:

Traceback (most recent call last):
  File "C:/Users/龚鸥波/Desktop/test_import/package_b/tmp4.py", line 8, in <module>
    from .tmp3 import test_bTmp3
ModuleNotFoundError: No module named '__main__.tmp3'; '__main__' is not a package

这里.表示的是__main__,我暂时也不清楚这时是什么意思,不过我们可以这么改写下:


try:
   from tmp3 import test_bTmp3
   from b_utils.bUtils import test_bUtils
except Exception as e:
   from .tmp3 import test_bTmp3
   from .b_utils.bUtils import test_bUtils

def test_bTmp4():
   print('这里是package_b包中tmp4模块下的test_bTmp4函数')

test_bTmp3()
test_bUtils()

这样不论我们是运行main.py还是tmp4.py就都不会报错了。

以上是自己在建项目中碰到的一个问题。

来源:https://www.cnblogs.com/xiximayou/p/15173828.html

标签:python,多级包,引用
0
投稿

猜你喜欢

  • 如何利用Python监控别人的网站

    2022-08-11 16:54:18
  • ASP 自动采集实现代码

    2011-03-07 11:17:00
  • JS IOS/iPhone的Safari浏览器不兼容Javascript中的Date()问题如何解决

    2023-09-23 19:39:47
  • perl批量查询ip归属地的方法代码

    2023-08-11 22:53:54
  • pandas DataFrame索引行列的实现

    2023-12-16 09:52:55
  • Python中工作日类库Busines Holiday的介绍与使用

    2023-01-30 23:59:04
  • 解决usageerror: line magic function "%%time" not found问题

    2022-06-16 15:53:29
  • python 使用ctypes调用C/C++ dll详情

    2023-03-30 06:00:57
  • Python垃圾邮件的逻辑回归分类示例详解

    2021-02-21 04:21:00
  • 三招解决SQL Server数据库权限冲突

    2009-03-16 16:58:00
  • python解析xml文件操作实例

    2022-01-02 10:39:13
  • python实现域名系统(DNS)正向查询的方法

    2021-03-26 17:20:57
  • python获得命令行输入的参数的两种方式

    2022-09-30 23:25:02
  • 联动选择菜单(二级联动菜单 三 级联动菜单)

    2023-06-26 22:37:55
  • python的数据与matlab互通问题:SciPy

    2022-05-16 04:53:48
  • 针对google Chrome的 CSS hacks

    2009-11-30 12:45:00
  • 浅谈Python反射 & 单例模式

    2023-10-14 21:16:30
  • numpy数组合并和矩阵拼接的实现

    2022-09-05 19:39:54
  • python爬虫headers设置后无效的解决方法

    2021-09-04 00:55:17
  • Python中的zipfile模块使用详解

    2023-02-26 22:44:37
  • asp之家 网络编程 m.aspxhome.com