Python 从同级目录导入时出现问题
这个问题是在Python2.7和相关导入的上下文中提出的。我已经经历了相关的问题,但事情仍然不适合我。我不知道我错过了什么 下面是我的目录层次结构Python 从同级目录导入时出现问题,python,python-2.7,python-import,Python,Python 2.7,Python Import,这个问题是在Python2.7和相关导入的上下文中提出的。我已经经历了相关的问题,但事情仍然不适合我。我不知道我错过了什么 下面是我的目录层次结构 . |-> wrapper.py |-> __init__.py |-> util | |-> hello.py | |-> __init__.py |-> src | |-> wrapper.py | |-> __init__.py 所有\uuuu init\uuuuu.py
.
|-> wrapper.py
|-> __init__.py
|-> util
| |-> hello.py
| |-> __init__.py
|-> src
| |-> wrapper.py
| |-> __init__.py
所有\uuuu init\uuuuu.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的副本,只需对其进行最小的更改即可运行(导入中的更改)。所有\uuuu init\uuuu.py也都存在。然而,任何运行它的尝试都会产生以下错误
Traceback (most recent call last):
File "wrapper.py", line 8, in <module>
from ..util import hello
ValueError: Attempted relative import in non-package
两个问题:
问题1。我做错了什么,或者什么东西没有引起我的注意
问题2。如何编写代码/src/\uuuu init\uuuuuuuuuuy.py,使“导入hello”在/src/wrapper.py中工作?简单的答案是,所有代码都需要一个父包。您不能只将
\uuuu init\uuuuuuy.py
放在根目录中,并期望它作为一个包
我将把你的选择分为好的和坏的,从坏的开始:
坏-相对导入:
你应该做的是把你所有的代码(aka
)放在一个适当命名的包中(src
对包来说是个坏名字)。说mypackage
。然后您将能够从python路径上可用的位置导入src.wrapper
,就像在包含mypackage
的目录中打开的python解释器一样。安装该包还可以使其在路径上可用
有关相对进口的更多信息以及其不好的原因:
mypackage
,但这次您摆脱了相对导入,从wrapper.py
内部使用import mypackage.util.hello
。为此,必须将python路径设置为包含包含mypackage
的目录
建议的方法是创建一个setup.py
文件并安装软件包。对于开发,您应该使用python setup.py develope
或pip install-e.
有关python打包的更多信息:
编辑:
对于第二季度,如果使用绝对导入,则可以使用import mypackage.util.hello as hello
或from mypackage.util import hello
。两者都是一样的
在某些特殊情况下,您可能有兴趣将
import util.hello作为hello
写入/mypackage/\uu init\uuuuuu.py
中,然后您可以使用mypackage import hello中的等等。如何运行/wrapper.py
?相关-有许多现有的答案解决Q1,只需搜索“在非包中尝试相对导入”。我无法回答问题2,因为问题的方向是错误的。您可以运行python-msrc.wrapper
,然后导入hello
同样地从hello导入hello
工作在src/wrapper.py
中。我认为,一般来说,避免从顶级以外的地方进行相对进口是明智的@ashishnitinpail:以“/src”作为“python wrapper.py”运行。@Michael Hoff:没有完全理解“python-m src.wrapper”。做什么和去哪里。它做什么?不,我的解决方案假设您在根目录中执行python。如错误消息所示,它显然不适用于相对包名。
import os
sys.path.append(os.path.abspath("../util/"))
import hello