Python与测试文件夹的相对导入

Python与测试文件夹的相对导入,python,python-3.x,Python,Python 3.x,我知道像这样的帖子可能有几千篇,我几乎都读过了,但我仍然无法解决我的问题 我有以下项目结构: project │ ├── main.py ├── module1 │ ├── __init__.py │ ├── b.py │ └── c.py │ ├── tests │ └── tests_module1.py 在tests_module1.py中,我想导入函数b.py

我知道像这样的帖子可能有几千篇,我几乎都读过了,但我仍然无法解决我的问题

我有以下项目结构:

project
│
├── main.py           
├── module1
│   ├── __init__.py    
│   ├── b.py    
│   └── c.py
│
├── tests   
│   └── tests_module1.py          
                       
在tests_module1.py中,我想导入函数b.py和c.py来测试它们的功能。我已经尝试了以下导入:

  • 从..模块1.b导入*
  • 从模块1.b导入*
  • 从。。进口b
我还尝试将init.py文件添加到项目以及测试文件夹中,但没有成功。 仅当我将test_module1.py移动到项目文件夹并使用以下工具导入时,它才起作用:

  • 从模块1.b导入*

我使用的是Python 3.9,而不是。。导入b您必须尝试

from ...module1 import *

查看一下修改python搜索路径:

修改Python的搜索路径

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

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

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

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

另见

    • 请参阅。 如果从
      tests
      目录中运行
      python3 tests\u module1.py
      ,Python不知道包结构

      尝试以下
      b.py

      # module1/b.py
      
      def hello():
          print("Hello world!")
      
      from module1 import b
      b.hello()
      
      将其导入
      测试\u module1.py

      # module1/b.py
      
      def hello():
          print("Hello world!")
      
      from module1 import b
      b.hello()
      
      使用
      -m
      (作为模块运行)开关从
      项目
      目录运行它:


      这将引发:ImportError:尝试在没有已知父包的情况下进行相对导入。此操作不提供问题的答案。若要评论或要求作者澄清,请在其帖子下方留下评论。-@李戴:你为什么这么说?这可能不是一个正确的答案,但它肯定是一个答案。@JeremyCaney-对我来说,
      try
      意味着这是一个建议,建议在评论中真正提出。@Lee_Dailey:建议OP“尝试”一些东西是可以的(]此类答案可能值得向下投票,但不值得删除。与仅代码答案相同。两者都不被视为高质量答案,但这就是向下投票选项的目的。VLQ队列适用于不努力回答问题的帖子(即,“谢谢”、“这不起作用”、“我也有这个问题”或只是一个链接)()。虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接供参考。如果链接页面发生更改,则仅链接的答案可能会无效。-@codingCat理解,感谢您的提示谢谢,从项目目录运行它是正确的提示。现在很明显当我在test目录中启动test_module1.py时,解释器对module1一无所知。