使用python -m

时间:2017-07-12 18:22:32

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

我查看了有关相关导入的所有链接,特别是有关顶级包的链接,但我仍然在使相关导入代码工作时遇到很多麻烦。作为参考,我使用的是Python 3.6。

我有一个我想要运行的测试目录,在他们自己的目录中隔离,测试。我想将所有模块包导入一个名为InputTests.py的文件中。这是我的项目目录的格式。file directory

在InputTests.py中,我尝试以这种方式导入模块:

from .. import modules

我收到错误:

File "/Users/wfehrnstrom/Desktop/meeting_minutes/tests/InputTests.py", 
line 2, in <module>
from .. import modules
ValueError: attempted relative import beyond top-level package<code>

但是,我正在使用命令:python -m tests.InputTests,它应该告诉解释器从我的顶级目录运行所有内容。所以我想我的问题是,为什么我的相对导入语句不起作用,因为我从上面的包中运行它。这个堆栈溢出帖似乎详细说明了我需要的内容,但是使用-m运行的解决方案对我来说不起作用:How to do relative imports in Python?

此外,在此堆栈溢出帖子中似乎存在矛盾:Relative importing modules from parent folder subfolder

后一篇文章似乎暗示了......的背景意义。不要根据执行Python命令的位置进行更改,但前者表示确实如此。这让我非常困惑。任何人都可以澄清相对进口并解决这种差异吗?谢谢。

1 个答案:

答案 0 :(得分:0)

我只能尝试回答你的Python 2.7问题,但我希望这对你有用。

PEP 328引用了#34;如何在Python中进行相对导入?#34;您链接的部分过时,因为它建议基于模块的__name__进行导入,对于主脚本将__main__,因此即使在使用{{1}时也会阻止在该模块中使用相对导入}。

PEP 366通过引入-m属性解决了这个问题。

当您使用__package__时,python -m tests.InputTests__package__的值将为InputTests.py。这不允许从父包导入,因为tests是当前和顶级包。

在目录&#34; meeting_minutes&#34;中运行tests应该解决这个问题。