7

我有一个需要同时支持 Python 2 和 3 的 setup.py。

该代码当前可以运行并且可以在 Python 2.x 中安装

如果我将该use_2to3 = True子句添加到我的 setup.py,那么该模块可以安装在 Python 3 中,但是,执行以下操作:

python setup.py test

导致失败,因为其中一个测试使用 StringIO 类,并且 Python 3 中的导入行出错(当前from StringIO import StringIO是 ,在 Python3 中应该是from io import StringIO

我认为,一旦添加了 use_2to3 关键字,所有测试(包括单元测试)都会在测试之前由 2to3 处理。

我错过了什么?如果有帮助,我的 setup.py 的大部分内容如下所示:

from setuptools import setup

setup(
    name='myproject',
    version='1.0',
    description='My Cool project',
    classifiers = [
        'Programming Language :: Python',
        'Programming Language :: Python :: 3',
    ],

    py_modules=['mymodule'],
    test_suite='test_mymodule',
    zip_safe=False,
    use_2to3 = True,
)

编辑:我觉得好像 2to3 没有在 a 上运行的原因python setup.py test是它爆炸了,堆栈跟踪的底部显示:

File "/home/aparkin/temp/mymodule/test_mymodule.py", line 18, in <module>
    from StringIO import StringIO

但是,如果我在 test_mymodule.py 上运行 2to3,那么该导入行应该已经改写为:

from io import StringIO

并且(在最坏的情况下)测试应该单独失败。

4

1 回答 1

1

为了使分发通过 2to3 拾取您的模块并运行,它必须在 py_modules 中列出。所以将其更改为:

py_modules=['mymodule', 'test_mymodule'],

不幸的是,在安装项目时安装 test_mymodule 会产生副作用,这可能是您不想要的。对于这样的情况,我通常会将项目转换为带有 mymodule.tests 子包的包。这样,测试可以“可安装”,而不会增加额外的混乱。

于 2012-06-18T15:20:58.023 回答