Я начал кодировать кое-что, используя модуль «click», и обнаружил ошибку при использовании click.echo с любым типом эха Юникода.
Python 2.7.13 (default, Mar 27 2017, 11:11:01) [MSC v.1700 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import click
>>> click.echo('Hello World')
Hello World
>>> click.echo(u'Hello World')
Traceback (most recent call last):
File "", line 1, in
File "C:\Users\eric\my_env\lib\site-packages\click\utils.py", line 259, in echo
file.write(message)
File "C:\Users\eric\my_env\lib\site-packages\click\_winconsole.py", line 180, in write
return self._text_stream.write(x)
File "C:\Users\eric\my_env\lib\site-packages\click\_compat.py", line 63, in write
return io.TextIOWrapper.write(self, x)
File "C:\Users\eric\my_env\lib\site-packages\click\_winconsole.py", line 164, in write
raise OSError(self._get_error_message(GetLastError()))
OSError: Windows error 6
Если я скачаю и установлю 64-разрядный установщик Python 2.7.13, эта проблема не возникнет. С эхом все в порядке.
Я много разбирался в этом и сейчас в растерянности.
Я не слишком знаком с Windows, Visual Studio или ctypes.
Я потратил некоторое время на поиск пути к коду для создания наименьшего файла (без щелчка), который демонстрирует эту проблему (см. ниже).
Он выдает ту же «ошибку Windows 6»... опять же, это отлично работает с Python, установленным из 2.7.13 64-битный установщик MSI.
Может ли кто-нибудь поделиться процессом создания установщиков Windows? Это ручной процесс или он автоматизирован?
Возможно, мне не хватает какого-то важного переключения на msbuild или что-то в этом роде. Любая помощь или идеи приветствуются.
Я не могу использовать загруженную копию Python... ее необходимо собрать с использованием определенной версии, обновления, исправления и т. д. Visual Studio.
Все, что я сделал, это
- клонировал cpython из github и checkout 2.7.13
- отредактировал некоторые xp-материалы из tk, чтобы его можно было скомпилировать на Windows Server 2003
В externals\tk-8.5.15.0\win\Makefile.in удалить строку ttkWinXPTheme.$(OBJEXT) - В externals\tk-8.5.15.0\win\makefile.vc удалить Строка $(TMP_DIR)\ttkWinXPTheme.obj
- В externals\tk-8.5.15.0\win\ttkWinMonitor.c удалите 2 строки TtkXPTheme_Init
В PCbuild\tcltk.props измените VC9 на VC11 в внизу
[*]PCbuild\build.bat -e -p x64 "/p:PlatformToolset=v110"
После этого я создал «установку», скопировав файлы .exe, .pyd, .dll, запустил get-pip.py, затем python -m pip установите virtualenv, затем virtualenv my_env, затем активируйте его, а затем выполните команду pip install click.
Но в этой урезанной версии вам не нужны pip, virtualenv или click... только ctypes.
Вероятно, вы могли бы даже собрать его без ключа -e в build.bat.
from ctypes import byref, POINTER, py_object, pythonapi, Structure, windll
from ctypes import c_char, c_char_p, c_int, c_ssize_t, c_ulong, c_void_p
c_ssize_p = POINTER(c_ssize_t)
kernel32 = windll.kernel32
STDOUT_HANDLE = kernel32.GetStdHandle(-11)
PyBUF_SIMPLE = 0
MAX_BYTES_WRITTEN = 32767
class Py_buffer(Structure):
_fields_ = [
('buf', c_void_p),
('obj', py_object),
('len', c_ssize_t),
('itemsize', c_ssize_t),
('readonly', c_int),
('ndim', c_int),
('format', c_char_p),
('shape', c_ssize_p),
('strides', c_ssize_p),
('suboffsets', c_ssize_p),
('internal', c_void_p)
]
_fields_.insert(-1, ('smalltable', c_ssize_t * 2))
bites = u"Hello World".encode('utf-16-le')
bytes_to_be_written = len(bites)
buf = Py_buffer()
pythonapi.PyObject_GetBuffer(py_object(bites), byref(buf), PyBUF_SIMPLE)
buffer_type = c_char * buf.len
buf = buffer_type.from_address(buf.buf)
code_units_to_be_written = min(bytes_to_be_written, MAX_BYTES_WRITTEN) // 2
code_units_written = c_ulong()
kernel32.WriteConsoleW(STDOUT_HANDLE, buf, code_units_to_be_written, byref(code_units_written), None)
bytes_written = 2 * code_units_written.value
if bytes_written == 0 and bytes_to_be_written > 0:
raise OSError('Windows error %s' % kernel32.GetLastError())
Мобильная версия