如何在python 3.6中使用绝对导入和相对导入?

jon*_*omo 4 python packages python-import python-3.x

我有一个名为“ slingshot”的python项目/库,具有以下目录结构:

slingshot/
    __init__.py
    __main__.py
    build.py
    deploy.py
    util/
        __init__.py
        prepare_env.py
        cdn_api.py
Run Code Online (Sandbox Code Playgroud)

__main__.py我想从导入功能util/prepare_env.py

我想确保util引用的是util我在项目中拥有的,而不是其他util可能安装在某处的库。

我尝试过,from .util import prepare_env但出现错误。

from util import prepare_env 似乎有效,但并未解决“ u​​til”的歧义。

我究竟做错了什么?


__main__.py 如下:

import os
from .util import prepare_env

if __name__ == '__main__':
    if 'SLINGSHOT_INITIALIZED' not in os.environ:
        prepare_env.pip_install_requirements()
        prepare_env.stub_travis()
        prepare_env.align_branches()
        os.environ['SLINGSHOT_INITIALIZED'] = 'true'
Run Code Online (Sandbox Code Playgroud)

当我键入时python3 ./slingshot,出现以下错误:

  File "./slingshot/__main__.py", line 2, in <module>
    from .util import prepare_env
ImportError: attempted relative import with no known parent package
Run Code Online (Sandbox Code Playgroud)

当我键入时python3 -m ./slingshot,出现以下错误:

/usr/local/opt/python3/bin/python3.6: Relative module names not supported
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 5

__main__.py使用-m命令行开关时,软件包中的模块使模块作为脚本运行。该开关采用模块名称,而不是路径,因此请删除./前缀:

python3 -m slingshot
Run Code Online (Sandbox Code Playgroud)

当前工作目录被添加到模块搜索路径的开头,因此slingshot首先找到它,而无需在此处给出相对路径说明。

-m交换机文档中

搜索sys.path命名的模块,并执行其内容作为__main__模块。

由于自变量是模块名称,因此不能给文件扩展名(.py)。模块名称应为有效的绝对Python模块名称[。]

[...]

与该-c选项一样,当前目录将添加到的开头sys.path