微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

两个 MWE 展示了如何不在 Python 中导入内容,当您想在子目录中运行文件作为主要用于测试目的

如何解决两个 MWE 展示了如何不在 Python 中导入内容,当您想在子目录中运行文件作为主要用于测试目的

好的,图中是两个 MWE 及其失败消息。

换句话说,我不能自然地从同一个子目录导入到我想作为主要运行的模块进行测试。这是第一张截图。

一个屏幕截图显示,我无法自然地从项目根目录导入子目录模块,该子目录模块同样作为 main 运行以进行测试。

视觉效果

Import in project subdir fails when running as main,and importing from subdir


Import from project subdir fails when running as main,and importing from project root

我不想做的是像我在我所有的项目中所做的那样,用如下几行来破解我的方式:

if __name__ == '__main__:
    import sys
    sys.append('..')

这是不雅的,因为它无法承受更改文件夹结构。

我还尝试将空白的 __init__.py 放入子目录中,并尝试放入如下行:

from .e import E

似乎没有什么容易的。当我在导入时无法处理基本的文件结构,这真的很糟糕。

那么,可以永久解决这两个问题的一般修复方法是什么?


文本代码

<proj root>/d.py

 class D:
     pass

<proj root>/root.py

from b.a import A

print("import from project root main")

<proj root>/b/a.py

from b.c import C

class A(C):
    pass

if __name__ == '__main__':
    print('import from project subdir')

<proj root>/b/c.py

class C:
    pass 

<proj root>/b/e.py

from d import D

class E(D):
    pass

if __name__ == '__main__':
    print("e can't import something from root")

首先将入口点设置为 a.py,将另一个错误的入口点设置为 e.py

谢谢!

解决方法

对于第一个错误,您在子目录 __init__.py 中创建一个 b,其内容为:

from .c import *

然而,这同样不适用于根目录。但我发现的最简洁的方法是打开你的项目属性,并精确地将 sys.path.append() 添加到 Python 路径:

在 WingWare 中:

Wingware Project Properties Dialog

这就解决了第二个问题。当您只添加 .. 时会出现警告,提示您应该使用绝对路径,但我对此表示同意。

如果您在没有 IDE 的情况下工作,只需修改 .. 环境变量。

快乐编码!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。