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 似乎有效,但并未解决“ util”的歧义。
我究竟做错了什么?
__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)
__main__.py使用-m命令行开关时,软件包中的模块使模块作为脚本运行。该开关采用模块名称,而不是路径,因此请删除./前缀:
python3 -m slingshot
Run Code Online (Sandbox Code Playgroud)
当前工作目录被添加到模块搜索路径的开头,因此slingshot首先找到它,而无需在此处给出相对路径说明。
从-m交换机文档中:
搜索
sys.path命名的模块,并执行其内容作为__main__模块。由于自变量是模块名称,因此不能给文件扩展名(
.py)。模块名称应为有效的绝对Python模块名称[。][...]
与该
-c选项一样,当前目录将添加到的开头sys.path。