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

Two MWE's that show how not to import things in Python, when you want to run a file in a subdir as main for testing purposes

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

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

下一个屏幕截图显示我无法自然地从项目根目录导入子目录模块,我类似地 运行宁作为主要用于测试目的。

视觉效果:


我不想做的是像我在所有项目中所做的那样破解我的方法,例如:

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

谢谢!

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

from .c import *

然而,这对根目录不起作用。但我发现的最简洁的方法,无需执行 sys.path.append() 就是打开你的项目属性,并将 .. 精确添加到 Python 路径:

在 WingWare 中:

这样就解决了第二个问题。当您简单地添加 .. 时会出现一个警告,您应该使用绝对路径,但我同意。

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

编码愉快!