仅在3.x上出现的带有Python包的ImportError

2024-06-16 19:04:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我在PyPA上有一个名为Airship的Python包,在__init__.py中有以下代码:

import os
from airship import sync

class suppress_stdout_stderr(object): # http://stackoverflow.com/questions/11130156
    def __init__(self):
        self.null_fds = [os.open(os.devnull,os.O_RDWR) for x in range(2)]
        self.save_fds = (os.dup(1), os.dup(2))

    def __enter__(self):
        os.dup2(self.null_fds[0], 1)
        os.dup2(self.null_fds[1], 2)

    def __exit__(self, *_):
        os.dup2(self.save_fds[0], 1)
        os.dup2(self.save_fds[1], 2)
        os.close(self.null_fds[0])
        os.close(self.null_fds[1])

def main():
    with suppress_stdout_stderr():
        sync()

sync()是在__main__.py中定义的,我在setup.py中有这些行将入口点定义为脚本:

entry_points={
    'console_scripts': [
        'airship=airship:main'
    ]
}

当我从python2.7.9安装的pip安装airship后运行airship时,它会按预期运行(也就是说,没有输出)。你知道吗

在Python 3.4.3安装中安装了pip中的同一个包,尝试执行相同的操作时,出现以下错误:

Traceback (most recent call last):
  File "C:\Python34\lib\runpy.py", line 170, in _run_module_as_main
    "__main__", mod_spec)
  File "C:\Python34\lib\runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "C:\Python34\Scripts\airship.exe\__main__.py", line 5, in <module>
  File "C:\Python34\lib\site-packages\airship\__init__.py", line 2, in <module>
    from airship import sync
ImportError: cannot import name 'sync'

是什么原因造成的?我如何修复它?你知道吗

(注意:我只试过在python3.x版本的pip上运行airship Windows,这就是我遇到这个问题的地方。我已经成功地在python2.x安装上运行了airship(在osx和Debian上)。你知道吗


Tags: inpyimportselfosmaindefline
1条回答
网友
1楼 · 发布于 2024-06-16 19:04:30

在Python3中,需要使用显式的相对导入,因此要在项目中导入顶级的sync模块:

from . import sync

如果syncairship的子模块,请执行以下操作:

from .airship import sync

相对导入样式是用PEP 328添加到Python2.4、2.5和2.6的,但直到Python3才删除隐式相对导入。你知道吗

相关问题 更多 >