我有一个需要同时支持 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导入 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 没有在 python setup.py 测试
上运行的原因是它爆炸了,堆栈跟踪的底部显示:
File "/home/aparkin/temp/mymodule/test_mymodule.py", line 18, in <module>
from StringIO import StringIO
但是如果我在 test_mymodule.py 上运行 2to3,那么该导入行应该被修改为:
from io import StringIO
并且(在最坏的情况下)测试应该单独失败。
最佳答案
为了分发通过 2to3 获取您的模块并运行,它必须列在 py_modules 中。所以将其更改为:
py_modules=['mymodule', 'test_mymodule'],
不幸的是,这有一个副作用,即在您安装项目时安装 test_mymodule,这可能是您不想要的。对于这种情况,我通常会将项目转换为带有 mymodule.tests 子包的包。这样,测试就可以“可安装”,而不会增加额外的困惑。
关于python - setup.py 中的 2 到 3 没有涵盖测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10853688/