Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从同级目录导入时出现问题_Python_Python 2.7_Python Import - Fatal编程技术网

Python 从同级目录导入时出现问题

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

这个问题是在Python2.7和相关导入的上下文中提出的。我已经经历了相关的问题,但事情仍然不适合我。我不知道我错过了什么

下面是我的目录层次结构

.
|-> 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