为什么unittest要求__init__.py必须出现在Python 3.6中?

Joh*_*Doe 5 python python-unittest python-3.6

我只是在python3.6 unittest(/usr/lib/python3.6/unittest/loader.py:286)中碰到了这一行:

is_not_importable = not os.path.isfile(os.path.join(start_dir, '__init__.py'))
Run Code Online (Sandbox Code Playgroud)

这导致单元测试发现无法运行我的测试。如果自python 3.3起不再需要__init__.py,为什么在python3.6库(ubuntu 17.10,idk,如果有关系)中仍然存在此行?

我相信这是一个错误,但我想确认一下。

当foo目录中没有__init__.py时,以下命令可以正常运行({PROJECT_HOME}作为占位符):

python3.6 -m unittest discover tests.foo -t {PROJECT_HOME} -p "*.py"
Run Code Online (Sandbox Code Playgroud)

虽然失败(带有ImportError: Start directory is not importable)

python3.6 -m unittest discover tests/foo -t {PROJECT_HOME} -p "*.py"
Run Code Online (Sandbox Code Playgroud)

区别在于。-> /当存在__init__.py时,两个命令的工作原理相同。

nfe*_*a78 -2

Python 存储库目录依赖于init .py 来控制 python 在导入模块时的行为。

所以你必须遵循打包命名空间包的指南

大多数情况下会使用原生命名空间包

另一个重要的事情是PYTHONPATH,因为它是一个环境变量,您可以设置它来添加 python 将在其中查找模块和包的其他目录。对于大多数安装,您不应设置这些变量,因为 Python 运行不需要它们。Python 知道在哪里可以找到它的标准库。

设置的唯一原因是维护您不想安装在全局默认位置(即 site-packages 目录)的自定义 Python 库的目录。