【Python】如何在Python项目中使用相对路径正确的导入模块/包

1. 问题描述

现有a.py文件,其中包含一个Test类如下:

# a.py

class Test:
    result: str

    def __init__(self, result):
        self.result = result

此外,还有一个aa.py文件,想要使用a.py中的Test类创建一个对象,并打印出对象的内容,如下:

# aa.py

<导入a.py中的类>

x = Test("a->aa success")
print(x.result)

2. Case1-同一目录

若a.py和aa.py在同一目录时,直接导入即可。

  • 目录结构:
    在这里插入图片描述
  • 代码
    a.py的内容同上,此处不再重复粘贴代码。
    aa.py需要修改为:
# aa.py

from a import Test

x = Test("a->aa success")
print(x.result)
  • 运行程序
    进入AA目录,使用python命令行运行脚本。
    在这里插入图片描述
    可以看出使用python aa.py运行完程序后,新增了一个 __pycache__目录,目录中的内容如下:
    在这里插入图片描述
    pychae里缓冲了相对应模块的编译版,能够加快模块的加载速度,详情参见官方文档

3. Case2-不在同一目录(简单情况)

  • 目录结构
    在这里插入图片描述
  • 代码
    a.py的内容同上,保持不变。
    由于a.py和aa.py目前不在同一目录下,需要使用相对路径导入a.py中的Test类,故aa.py需要修改为:
# aa.py

from ..a import Test

x = Test("a->aa success")
print(x.result)
  • 运行程序
    此时,若仍按照原来的方法运行程序,会报错。
    在这里插入图片描述
    解决方法:
    回到顶级目录!回到顶级目录!回到顶级目录!使用python -m A.AA.aa 运行程序。
    在这里插入图片描述

4. Case3-不在同一目录(复杂情况)

  • 目录结构
    在这里插入图片描述
  • 情况描述
    在这里插入图片描述
    a.py:包含Test类,并打印In a.py
    aa.py:包含Try类,并创建了一个Test类的对象,打印a->aa success
    aaa.py:创建Test类和Try类的实例,分别打印a->aaa successaa->aaa success
  • 运行程序
    顶级目录执行命令python -m A.AA.AAA.aaa,运行结果如下:
    在这里插入图片描述
    我们原本只想执行aaa.py程序,打印a->aaa successaa->aaa success。但实际运行结果中,将a.py和aa.py中的内容也打印出来了(相当于也运行了a.py和aa.py),这与我们的期待结果不符。
    解决方法:
    使用if __name__ == “__main__” 来规范程序。
    修改后的代码及运行结果如下:
    在这里插入图片描述
    此时使用python -m A.AA.AAA.aaa运行程序aaa.py时,只打印了aaa.py想要输出的内容。这是因为,当使用命令行执行aaa.py时,该文件/模块的内置属性__name__会变成__main__,一般情况下,文件/模块的__name__同文件/模块名一致。

5. 扩展内容-运行python项目

目录结构:
在这里插入图片描述
在包里新增__init__.py__main__.py文件,从而可以在顶级目录处,通过python -m A运行整个项目A。
项目代码:
链接: https://pan.baidu.com/s/1fNqvzwE8SVdR5XNvjRdI2g 提取码: 5kny
乏了QAQ

参考博客

[1] https://blog.csdn.net/weixin_38256474/article/details/81228492?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-3.base&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-3.base

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值