您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

在python中使用absolute_import并处理相对模块名称冲突

5b51 2022/1/14 8:22:30 python 字数 2936 阅读 525 来源 www.jb51.cc/python

我真的希望这是一个简单的例子,让我想念复杂的 Python2导入机制.我有以下设置: $> ls -ltr pypackage1 total 3 -rw-r--r-- 1 pelson pelson 0 Aug 17 19:20 io.py -rw-r--r-- 1 pelson pelson 0 Aug 17 19:20 __init__.py -rw-r--r-- 1 pelson

概述

$> ls -ltr pypackage1 
total 3
-rw-r--r-- 1 pelson pelson   0 Aug 17 19:20 io.py
-rw-r--r-- 1 pelson pelson   0 Aug 17 19:20 __init__.py
-rw-r--r-- 1 pelson pelson  57 Aug 17 19:22 code.py
$> cat pypackage1/code.py 
from __future__ import absolute_import

import zipfile

即我只有一个带有空__init__.py和io.py的存根包,以及一个2行的code.py文件.

我可以导入pypackage1:

$> python -c "import pypackage1.code"

但是我无法运行code.py文件

$> python pypackage1/code.py
Traceback (most recent call last):
  File "pypackage1/code.py",line 3,in <module>
    import zipfile
  File "python2.7/zipfile.py",line 462,in <module>
    class ZipExtFile(io.BufferedioBase):
AttributeError: 'module' object has no attribute 'BufferedioBase'

显然问题与zipfile模块在内置io模块上拾取我的相对io模块有关,但我认为我的__future__ import absolute_import会修复它.

在此先感谢您的帮助,

当您运行包内的脚本时,python不会将该目录解释为包,从而将工作目录添加到PYTHONPATH.
这就是为什么zipfile模块导入的io模块是你的io模块而不是标准库中的模块.

我建议在你的包之外(或在bin / scripts文件夹中)创建一个简单的启动器脚本,并启动它.此脚本可以包含以下内容

from pypackage1 import code

code.main()

另一种方法是告诉python解释器您要执行的文件是模块的一部分.您可以使用-m命令行选项执行此操作.在您的情况下,您将不得不这样做:

python -m pypackage1.code

请注意,-m的参数应该是模块名称,而不是文件名.

总结

以上是编程之家为你收集整理的在python中使用absolute_import并处理相对模块名称冲突全部内容,希望文章能够帮你解决在python中使用absolute_import并处理相对模块名称冲突所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶