这个问题是在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?
答案 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
文件并安装您的软件包。要进行开发,您应该使用mypackage
或setup.py
有关python包装的更多信息:https://packaging.python.org/distributing/
编辑:
对于您的Q2,如果您使用绝对导入,则可以使用python setup.py develop
或pip install -e .
。两者都是一样的。
在某些特殊情况下,您可能有兴趣在import mypackage.util.hello as hello
内撰写from mypackage.util import hello
,然后您可以使用import util.hello as hello
等。