1

我目前正在尝试使为 Python2 编写的模块与 Python3.2 兼容。

我首先确保所有代码都可以自动转换2to3并添加到 setup.py 中:

use_2to3 = True,

到目前为止,一切正常。

现在,我想测试转换后的文件。
编写测试以便它们可以在没有2to3. 我的文件夹结构是:

# ls /path/to/mymodule
setup.py
mymodule/
tests/
build/

在我的 setup.py 中,我添加了

test_suite = "tests",

现在我执行

rm -rf build/
python3 setup.py build 
python3 setup.py test

为了测试我自动转换的代码。但它失败了,因为测试仍然在mymodule目录上运行:

File "/path/to/mymodule/mymodule/main.py", line 35
    logger.info(u'Scanning {path}'.format(path=self.path))
                                    ^
SyntaxError: invalid syntax
[This Syntax error is in MODULE code, not in TEST code.]
[I expect the path to be: /path/to/mymodule/build/lib/mymodule/main.py]

在我build/的是正确转换的文件。如果分发正确转换它们,为什么不为转换后的文件执行测试?

我错过了什么吗?我已经检查了 setuptools/distribute 的文档以查找缺少的参数。我不想将我的测试包含在模块中,因为有几个资源文件仅用于测试会占用不必要的空间。

=> 在 python3 中运行时,我可以配置我的 setup.py 以运行不同文件夹的测试吗?

4

1 回答 1

1

首先,该行在logger.info(u'Scanning {path}'.format(path=self.path))Python 3.2 中无效。的语法u''无效,因为u在 Python 3.0 中删除并在 Python 3.3 中重新引入,而不是 3.2。

这意味着您应该将您的测试转换为在没有此类 Unicode 字符串文字的 Python 3.2 中工作。一种替代方法是使用字节文字并对其进行解码(b''.decode('UTF-8')),或者您可以简单地使用字符串,因为它们在 3.x+ 中已经是 Unicode。

其次,我建议tox您在多个 Python 版本中使用它来测试您的代码库。它将使用提供的setup.py文件,创建多个虚拟环境并分别测试每个 Python 版本中的代码库。这意味着您可以在 2.x 和 3.x 中运行测试并验证一切是否仍然有效。

无论如何,这2to3不是推荐的方法 - Python 2.x 项目应该通过调整代码库以与 2.x 和 3.x 兼容来移植。

于 2014-12-09T22:25:47.833 回答