python - 基本的 Python 导入机制

标签 python python-3.x import python-module

我有以下目录树:

project/
  A/
    __init__.py
    foo.py
  TestA/
    __init__.py
    testFoo.py

testFoo的内容是:

import unittest
from A import foo

project 目录运行 python testA/testFoo.py

我收到一个ModuleNotFoundError No module named A

我有两个问题:如何从 TestA.testFoo 导入并运行 A.foo 以及为什么在 Python 中掌握导入逻辑如此困难?有没有什么调试技巧可以快速解决此类问题,很抱歉我不得不用这样的基础问题来打扰您?

最佳答案

当你执行一个文件时,会生成一个名为 python path 的环境变量,python import 使用这个变量来查找要导入的文件,这个路径是用你正在执行的文件的路径生成的,它将在当前目录和包含 __init__.py 文件的子目录,如果要从同一级别的目录导入,则需要修改 python 路径或更改项目的体系结构,以便执行的文件为始终处于顶层。

你可以像这样包含你的Python路径:

import sys
sys.path.insert(0, "/path/to/file.py")

您可以阅读有关导入系统的更多信息:https://docs.python.org/3/reference/import.html

我认为最好的方法是不要触及 python 路径并将测试目录包含到测试文件所在的目录中:

project/
  A/
    __init__.py
    foo.py
    TestA/
        __init__.py
        testFoo.py

然后在您的 A 或项目目录中运行 python -m unittest 命令,它将在您的当前目录和子目录中搜索 test 并执行它。

有关单元测试的更多信息:https://docs.python.org/3/library/unittest.html

关于python - 基本的 Python 导入机制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52146524/

相关文章:

Python 3 编码错误谷歌翻译 API

python - 使用 Python 将某些文件复制到其他文件夹(Python 中的文件管理)

typescript - 升级到 TypeScript 3.5 导致导入的命名空间在运行时无法找到 Enum

python - 密码字段以纯文本形式显示密码

python - psycopg2.操作错误: FATAL: client authentication failed

Python 从模块变量导入

sql - postgres 抛出的 COPY FROM 中的语法错误

Python 套接字发送缓冲区与。强度

python - 向下转换为 pybind11 派生类

python - 网络驱动程序异常 : Message: Service/usr/lib/chromium-browser/chromedriver unexpectedly exited on Raspberry-Pi with ChromeDriver and Selenium