【问题标题】:Python relative Imports with test folder带有测试文件夹的 Python 相对导入
【发布时间】:2021-03-09 10:01:21
【问题描述】:

我知道可能有成千上万这样的帖子,我几乎都阅读了它们,但我仍然无法解决我的问题。

我的项目结构如下:

project
│
├── main.py           
├── module1
│   ├── __init__.py    
│   ├── b.py    
│   └── c.py
│
├── tests   
│   └── tests_module1.py          
                       

在 tests_module1.py 中,我想导入函数 b.py 和 c.py 来测试它们的功能。我已经尝试过以下导入:

  • 从 ..module1.b 导入 *
  • 从模块 1.b 导入 *
  • 从 .. 进口 b

我还尝试将 init.py 文件添加到项目以及测试文件夹中,但没有成功。 它仅在我将 test_module1.py 移动到项目文件夹并导入时才有效:

  • 从模块 1.b 导入 *

我正在使用 Python 3.9

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

    this post。 如果您从tests 目录中运行python3 tests_module1.py,Python 不知道包结构。

    试试下面的b.py

    # module1/b.py
    
    def hello():
        print("Hello world!")
    

    导入到tests_module1.py:

    from module1 import b
    b.hello()
    

    使用-m(作为模块运行)开关project 目录运行它:

    python3 -m tests.tests_module1
    

    【讨论】:

    • 谢谢,从项目目录运行它是正确的提示。现在很明显,当我在 Test 目录中启动 test_module1.py 时,解释器对 module1 一无所知。
    【解决方案2】:

    你必须尝试而不是from .. import b

    from ...module1 import *
    

    【讨论】:

    • 这会引发:ImportError:尝试使用没有已知父包的相对导入
    • 这并没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方留下评论。 - From Review
    • @Lee_Dailey:你为什么这么说?这可能不是一个正确的答案,但肯定是一个的答案。
    • @JeremyCaney - 对我来说,try 意味着这是一个真正应该在 comment 中提出的建议。
    • @Lee_Dailey:建议 OP “尝试”某些东西是可以的(source]。这样的答案可能值得反对,但不应该删除。与纯代码答案相同。两者都不被考虑 quality 答案,但这就是 downvote 选项的用途。VLQ 队列用于不努力回答问题的帖子(即,“谢谢”,“这没有工作”,“我也有这个问题”,或者只是一个链接)(source)。
    【解决方案3】:

    看看修改python搜索路径:https://docs.python.org/3.9/install/index.html#modifying-python-s-search-path

    修改 Python 的搜索路径

    当 Python 解释器执行 import 语句时,它会沿着搜索路径搜索 Python 代码和扩展模块。构建解释器时,路径的默认值被配置到 Python 二进制文件中。您可以通过导入sys 模块并打印sys.path 的值来确定路径...

    本地安装包的预期约定是将它们放在…/site-packages/ directory 中,但您可能希望将 Python 模块安装到任意目录中……添加目录有多种不同的方法。

    最方便的方法是将路径配置文件添加到 Python 路径上已经存在的目录中,通常是 .../site-packages/ 目录。路径配置文件的扩展名为.pth,每行必须包含一个单独的路径,该路径将附加到sys.path...

    >

    最后,sys.path 只是一个普通的 Python 列表,因此任何 Python 应用程序都可以通过添加或删除条目来修改它。

    另见

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
    • @codingCat 明白了,谢谢提示
    猜你喜欢
    • 2018-03-13
    • 2013-07-12
    • 2013-01-18
    • 2014-02-20
    • 1970-01-01
    • 1970-01-01
    • 2017-01-25
    • 1970-01-01
    • 2012-12-13
    相关资源
    最近更新 更多