我目前正在将使用Flask(Python 2.7)编写的Web应用程序迁移到Python3。到目前为止,我已经设法使所有功能正常运行,但是有一点点装饰性的内容使我完全感到困惑,我无法解决它。
这是一个对代码run_pylint.py
运行静态分析的文件。我将在重要内容上略微缩短文件。
RESULT_EXPRESSION = re.compile(r'Your code has been rated at (\d*\.*\d*)/10')
VALIDATION_PERFECT = "✓ Pylint validation SUCCESSFUL! Perfect score!"
# and a couple of other options...
class PyLintOutput:
"""
Pylint report storage and retrieval
"""
def __init__(self):
"""Initialize the storage"""
self.content = []
self.rate = None
... # skipping several unimportant methods
def get_rate(self):
"""
After having been fed with PyLint output (via read()),
determine the rate given to the module by PyLint.
:return: A float between 0 (worst) to 10 (no issues detected).
"""
if self.rate is not None:
return self.rate
for line in reversed(self.read()):
result = re.search(RESULT_EXPRESSION, line)
if result is None:
continue
self.rate = float(result.group(1))
return self.rate
return 0
def __str__(self):
"""
Get the full Pylint output as a string.
"""
return "".join(self.content)
if __name__ == '__main__':
# instance of the class
OUT = PyLintOutput()
# run PyLint static code analysis
Run([MODULE_NAME], reporter=TextReporter(OUT), do_exit=False)
if OUT.get_rate() < THRESHOLD:
# if under threshold it prints a message to fix the bugs..
elif OUT.get_rate() == THRESHOLD:
# imperfect validation
else:
# perfect score
print(VALIDATION_PERFECT)
我希望这个想法很明确。因此,我们可以说分数确实是完美的,因此转到else条件,该条件应显示以下消息:
✓ Pylint validation SUCCESSFUL! Perfect score!
它在我的控制台中执行此操作(我正在使用PyCharm)。但是,对于部署此Web应用程序,我使用Docker和Jenkins。简要说明:一个运行带有Python 3.6的centOS的Docker容器,可构建Web应用程序。构建Web应用程序的步骤之一是静态代码分析。如果失败,则部署失败。所有这些部署都在单个Jenkins工作中进行。这是控制台日志,当它到达完全相同的步骤时,我在上面提到过:
[91mTraceback (most recent call last):
File "run_pylint.py", line 123, in <module>
print(VALIDATION_PERFECT)
UnicodeEncodeError: 'ascii' codec can't encode character '\u2713' in position 0: ordinal not in range(128)
我不确定为什么它不会以相同的方式出现在控制台中。在迁移过程中,我修复了代码其他部分的类似问题。很自然,我尝试了很多不同的东西,包括:
1)
VALIDATION_PERFECT = u"✓ Pylint validation SUCCESSFUL! Perfect score!"
...
else:
print(VALIDATION_PERFECT.encode("utf8))
Now, the tests pass, but the string is shown like this (in a bytes format):
b'\xe2\x9c\x93 Pylint validation SUCCESSFUL! Perfect score!'
我尝试对此进行解码,因此它可以变成普通的Python 3字符串,但不,与上面的错误相同。
2)我遇到了我使用的Stack Overflow中的一个函数,但是它给了我同样的错误:
def safeStr(obj):
try: return str(obj)
except UnicodeEncodeError:
return obj.encode('ascii', 'ignore').decode('ascii')
except: return ""
3)我尝试在“ utf8”中使用不同的编码/解码组合,但未成功。我知道Python 3现在在普通字符串中支持unicode,而当我在本地执行此脚本时,我尝试过的所有thign都可以在控制台中使用。但是,问题仍然存在于我的詹金斯工作中。
有人可以给我任何提示吗?
答案 0 :(得分:1)
从https://pastebin.com/2JC7kz9r答案中被盗,您需要在Jenkins服务器上设置PYTHONENCODING环境变量。显然,它既可以在Jenkins管理控制台中完成,也可以在调用python验证脚本之前在shell中执行:
export PYTHONIOENCODING=UTF-8