从父目录导入Python

Jus*_*oll 19 python

我有以下内容:

         ModuleFolder
              |
              |-->. ModuleFile.py .
              |
              '-->. TestsFolder .
                         |
                         '---> UnitTest1.py
Run Code Online (Sandbox Code Playgroud)

我正在尝试从父目录导入.在这种情况下,我试图从测试文件夹运行"UnitTest1.py",并从它上面的目录(文件"ModuleFile.py")导入.

  • 我知道已经有很多答案了. SO问题1,SO问题2,每隔一个问题.我只是找不到"使用../"作为相对导入而不是显式路径.
  • 我知道,从Python 2.5开始,他们根据提到使用的文档支持"相对导入",from .. import *但我特意尝试这样做,import MyModuleName因此我可以在单元测试中更明确,并避免名称的错误/冲突.

我在做什么(它对我有用)如下:

sys.path.append("../")
Run Code Online (Sandbox Code Playgroud)

然后从父目录导入我需要的内容.

  • 是的,父目录中有__init__.py,
  • 不,我的父路径不是Python路径或环境变量的一部分
  • 为什么我不添加父路径sys.path?因为它是相对的.如果我从/ home/workspace/MyModule/unittests /运行并且我的模块在/ home/workspace/MyModule /下我假设如果同事运行这个,那么添加/ home/workspace/MyModule /到路径不一定是真的在他自己的/ home/documents/MyModule目录下的机器上.

我的问题:

这是Python适当的吗?如果没有,这有什么问题.有没有更好的办法?或者这是一个真正的RTFM时刻,答案是我已经看过的7个以上SO问题之一?(我看到那些都推荐显式路径而不是我采用的相对路径方法).

其他有用的信息:

  • Python 2.6
  • 在Linux上工作但可以轻松跳转到Win.

Eev*_*vee 27

不要从tests文件夹运行测试.从项目的根目录运行它,该目录是模块文件夹.您应该很少需要使用其中任何一个, sys.path或者PYTHONPATH当您这样做时,您要么在其他库中造成错误,要么让用户的生活更加艰难.

python -m TestsFolder.UnitTest1
Run Code Online (Sandbox Code Playgroud)

如果您使用像py.test这样的测试运行,您可以py.test从结帐的根目录运行,它会为您找到测试.(假设你将测试test_unit1.py命名为更类似的东西.你当前的命名方案有点不正统.;))

  • 不,不是.运行带有`python foo/bar.py`的可导入文件是一个坏主意,因为它将`foo /`添加到`sys.path`,而这很少是你想要的.使用`-m`运行入口点,并使用测试运行器运行测试.(我非常非常'cd`比我的项目根更深.) (3认同)
  • 是否在“经验丰富的pythonistas”中理解了这一点,因为很少从测试目录运行测试,并且通常应该在模块级别调用测试?似乎应该从父目录运行测试,这与您的直觉相反,您可能还需要转到测试目录并键入`python test.py`以查看结果-我的意思是,所有其他非测试* .py文件。 (2认同)

Lau*_*RTE 5

最好在这样的情况下插入你的相对路径sys.path:

import sys
sys.path.insert(0, '../')
Run Code Online (Sandbox Code Playgroud)