使用Python包的ImportError只发生在3.x上

时间:2015-05-17 23:47:11

标签: python pip python-3.4

我在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()
{p> sync()__main__.py中定义,我在setup.py中有这些行来将入口点定义为脚本:

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

当我在{2.7}安装上从airship安装pip后运行pip时,它按预期运行(即没有输出)。

当我尝试在Python 3.4.3安装上从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' 安装相同的软件包时,我收到此错误:

airship

造成这种情况的原因是什么?如何解决?

(注意:我只尝试在{3.}}的Python 3.x版本上运行pip Windows,这是我遇到此问题的地方。我已成功在OS X和Debian上的Python 2.x安装上成功运行airship

1 个答案:

答案 0 :(得分:2)

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

from . import sync

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

from .airship import sync

相对导入样式已添加到带有PEP 328的python 2.4,2.5和2.6中,但直到python 3才删除隐式相对导入。