add cmd.chcp for Windows

This commit is contained in:
Prodesire 2017-12-22 18:54:30 +08:00
parent fcc01429cf
commit 0b0a0ba2f7
2 changed files with 38 additions and 0 deletions

View File

@ -61,3 +61,22 @@ if PY2 and WINDOWS:
else:
def cmdline_argv():
return sys.argv
if WINDOWS:
from ctypes import windll
class chcp(object):
"""
Context manager which sets the active code page number.
It could also be used as function.
"""
def __init__(self, code):
self.origin_code = windll.kernel32.GetConsoleOutputCP()
windll.kernel32.SetConsoleOutputCP(code)
def __enter__(self):
pass
def __exit__(self, exc_type, exc_val, exc_tb):
windll.kernel32.SetConsoleOutputCP(self.origin_code)

View File

@ -1,4 +1,6 @@
import sys
import pytest
from pydu.platform import WINDOWS
from pydu.compat import string_types
from pydu.string import safeunicode
from pydu.cmd import run, cmdline_argv
@ -22,3 +24,20 @@ def test_cmdline_argv():
argv = cmdline_argv()
for s in argv[1:]:
assert isinstance(s, string_types)
@pytest.mark.skipif(not WINDOWS, reason='Not support non windows')
def test_chcp():
from pydu.cmd import chcp
from ctypes import windll
origin_code = windll.kernel32.GetConsoleOutputCP()
with chcp(437):
assert windll.kernel32.GetConsoleOutputCP() == 437
assert windll.kernel32.GetConsoleOutputCP() == origin_code
try:
chcp(437)
assert windll.kernel32.GetConsoleOutputCP() == 437
finally:
windll.kernel32.SetConsoleOutputCP(origin_code)