我真的希望这是一个简单的例子,让我想念复杂的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 pelson 57 Aug 17 19:22 code.py
$> cat pypackage1/code.py
from __future__ import absolute_import
import zipfile
Run Code Online (Sandbox Code Playgroud)
即我只是一个存根包空__init__.py和io.py和2号线code.py的文件.
我可以导入pypackage1:
$> python -c "import pypackage1.code"
Run Code Online (Sandbox Code Playgroud)
但我无法运行该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'
Run Code Online (Sandbox Code Playgroud)
显然问题与zipfile模块在内置io模块上拾取我的相对io模块有关,但我认为我from __future__ import absolute_import会解决这个问题.
在此先感谢您的帮助,
这是正确的行为.如果要修复错误,只需不要从包内运行.
当您运行包内的脚本时,python不会将该目录解释为包,从而将工作目录添加到PYTHONPATH.这就是为什么io模块导入的zipfile模块是您的io模块而不是标准库中的模块.
我建议在你的包(或bin/scripts文件夹)之外创建一个简单的启动器脚本,并启动它.此脚本可以包含以下内容:
from pypackage1 import code
code.main()
Run Code Online (Sandbox Code Playgroud)
另一种方法是告诉python解释器您要执行的文件是模块的一部分.您可以使用-m命令行选项执行此操作.在您的情况下,您将不得不这样做:
python -m pypackage1.code
Run Code Online (Sandbox Code Playgroud)
请注意,参数-m应该是模块名称,而不是文件名.
| 归档时间: |
|
| 查看次数: |
4026 次 |
| 最近记录: |