从包中的父目录导入模块

时间:2018-06-18 03:19:15

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

我已经提到了几个主题和文章,包括:

但无法获得理想的结果。

假设我有一个名为“helloworld”的目录:

helloworld
|--__init__.py
|--say_hello.py
|--another_hello
   |--__init__.py
   |--import_hello.py

这是say_hello.py:

def hello_world():
    print("Hello World!")
if __name__ == "__main__":
    hello_world()

这是import_hello.py:

from .. import say_hello
say_hello.hello_world()

我希望在不使用say_hello模块的情况下,无论何时拨打python /path/to/import_hello.py 导入sys模块。

但是,现在当我python /path/to/import_hello.py时,它将返回ValueError: attempted relative import beyond top-level package,我不知道为什么它不起作用。

即使这不起作用:

from helloworld import say_hello
say_hello.hello_world()

它会给我ModuleNotFoundError: No module named 'helloworld'

2 个答案:

答案 0 :(得分:1)

你不能像这样从包中间运行脚本。执行此操作后,如果您在helloworld.another_hello.import_hello之外运行/path/to/helloworldsparent/,则表示您正在__main__内运行/path/to/helloworldsparent/helloworld/another_hello。因此,它没有import的父包作为..

您可以使用-m运行模块:

$ python -m helloworld.another_hello.import_hello

...假设helloworld的目录位于sys.path上(例如,因为您已将其安装到site-packages中,或者因为您当前的工作目录是其父目录,或者因为您已经设置了PYTHONPATH

但更清晰的解决方案通常是单独留下深层模块,并在顶层写入“入口点”脚本,如下所示:

import helloworld.another_hello.import_hello
helloworld.another_hello.import_hello.main()

如果你正在使用setuptools(并且你真的应该为任何复杂到足以需要两个级别的包),你可以让它在安装时自动创建入口点脚本(或{{1时间,在开发期间)。请参阅文档中的Automatic Script Creation(但您可能还需要阅读其他部分以获取整个想法;文档非常庞大且复杂)。

答案 1 :(得分:0)

我觉得您可以先尝试将父路径添加到系统路径,然后尝试使用导入。

from sys import path as pylib
import os
pylib += os.path.abspath('..')
from helloworld import say_hello

希望它有所帮助!!