从兄弟目录导入的问题

时间:2017-04-16 13:47:42

标签: python python-2.7 python-import

这个问题是在python 2.7和相关导入的背景下进行的。我已经完成了相关的问题,事情仍然无法解决。我不知道我在这里失踪了什么?

以下是我的目录层次结构

.
|-> wrapper.py
|-> __init__.py
|-> util
|    |-> hello.py
|    |-> __init__.py
|-> src
|    |-> wrapper.py
|    |-> __init__.py

所有 __ init __。py 仅为空白文件"将目录视为包含包"

以下是./util/hello.py的内容。它有自己的主要功能,可以自己运行。

#!/usr/bin/python
# This is hello.py.

import sys

# Define a main() function that prints a little greeting.
def main():
  print "Hello World!!!"

# Standard boilerplate that calls the main() function.
if __name__ == '__main__':
    main()

以下是./wrapper.py的内容。它也有自己的主要功能,并使用./util/hello.py来实现其目标。

#!/usr/bin/python
# This is wrapper.py.

import sys
from util import hello

# Define a main() function that prints a little greeting.
def main():
    hello.main()        # This prints "Hello World!!!"

# Standard boilerplate that calls the main() function.
if __name__ == '__main__':
    main()

以下是./src/wrapper.py的读取方式。

#!/usr/bin/python
# This is wrapper.py.

import sys
from ..util import hello

# Define a main() function that prints a little greeting.
def main():
    hello.main()        # This prints "Hello World!!!"

# Standard boilerplate that calls the main() function.
if __name__ == '__main__':
    main()

如您所见,它几乎完全是./wrapper.py的副本,只需很少的更改即可运行(导入更改)。所有 __ init __。py 也存在。但是,任何运行它的尝试都会出现以下错误。

Traceback (most recent call last):
  File "wrapper.py", line 8, in <module>
    from ..util import hello
ValueError: Attempted relative import in non-package

但是,如果我按照以下方式导入hello.py:

import os
sys.path.append(os.path.abspath("../util/"))
import hello

两个问题:

Q1。我做错了什么或者我的注意力是什么?

Q2。我怎样才能编码 ./ src / __ init __。py ,这样只需&#34;导入你好&#34;适用于./src/wrapper.py?

1 个答案:

答案 0 :(得分:1)

简单的答案是您需要拥有所有代码的父包。您不能只将__init__.py放在根目录中,并希望它表现为一个包。

我会将你的选择分为好的和坏的,从坏的开始:

糟糕 - 相对进口: 你应该做的是将所有你的代码(又名.)放在一个适当命名的包中(src是一个包btw的错误名称)。说mypackage。然后,您将能够将src.wrapper仅作为mypackage.src.wrapper从python路径上可用的位置导入,就像在目录中打开的python解释器 {{ 1}}。安装包也可以在路径上使用。

有关相对进口及其不良原因的更多信息:

好 - 非相对进口: 更好的方法是以绝对的方式通过包导入。您仍然需要创建父包mypackage,但这次您摆脱了相对导入,并使用 {/ 1>}内的 mypackage。为此,您必须设置python路径以包含包含import mypackage.util.hello的目录。

建议的方法是创建一个wrapper.py文件并安装您的软件包。要进行开发,您应该使用mypackagesetup.py

有关python包装的更多信息:https://packaging.python.org/distributing/

编辑: 对于您的Q2,如果您使用绝对导入,则可以使用python setup.py developpip install -e .。两者都是一样的。

在某些特殊情况下,您可能有兴趣在import mypackage.util.hello as hello内撰写from mypackage.util import hello,然后您可以使用import util.hello as hello等。