Python 3.5.5, работающий под Wine, устанавливает переменную среды с пустым именем строки - PullRequest
0 голосов
/ 24 августа 2018

Привет! Мне нужно запустить Python под Wine (развертывание на CI), и я столкнулся со странным поведением. Если я запускаю интерпретатор Python внутри Wine следующим образом (очистка enux linux):

env -i wine cmd /C python

Я получаю это в os.environ:

>>> print(list(os.environ))
['WINELOADERNOEXEC', 'SYSTEMDRIVE', 'PROCESSOR_ARCHITECTURE', 'PROCESSOR_LEVEL', 'PATHEXT', 'PROGRAMFILE
S', 'PROMPT', 'HOMEPATH', 'SYSTEMROOT', 'OS', 'PROCESSOR_IDENTIFIER', 'HOMEDRIVE', 'WINDIR', 'USERPROFIL
E', 'TMP', '', 'USERDOMAIN', 'COMSPEC', 'PROCESSOR_REVISION', 'NUMBER_OF_PROCESSORS', 'COMMONPROGRAMFILE
S', 'ALLUSERSPROFILE', 'APPDATA', 'LOGONSERVER', 'SESSIONNAME', 'PUBLIC', 'CLIENTNAME', 'WINSYSDIR', 'US
ERNAME', 'TEMP', 'PROGRAMDATA', 'COMPUTERNAME', 'LOCALAPPDATA', 'PATH']

Как вы можете видеть, есть переменная с ключом '', которая является проблемой, потому что много кода на python (например, модуль подпроцесса фактически проверяет это и умирает за исключением наличия недопустимых переменных среды).

Если я проверяю фактическую среду Windows с помощью SET, я не получаю эту переменную:

$ env -i wine cmd /C SET
ALLUSERSPROFILE=C:\users\Public
APPDATA=C:\users\bruno\Application Data
CLIENTNAME=Console
CommonProgramFiles=C:\Program Files\Common Files
COMPUTERNAME=schrot
ComSpec=C:\windows\system32\cmd.exe
HOMEDRIVE=C:
HOMEPATH=\users\bruno
LOCALAPPDATA=C:\users\bruno\Local Settings\Application Data
LOGONSERVER=\\schrot
NUMBER_OF_PROCESSORS=8
OS=Windows_NT
PATH=C:\windows\system32;C:\windows;C:\windows\system32\wbem;C:\Program Files\Miniconda3;C:\Program File
s\Miniconda3\Scripts;C:\Program Files\Miniconda3\Library\bin
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH
PROCESSOR_ARCHITECTURE=x86
PROCESSOR_IDENTIFIER=x86 Family 6 Model 158 Stepping 9, GenuineIntel
PROCESSOR_LEVEL=6
PROCESSOR_REVISION=9e09
ProgramData=C:\ProgramData
ProgramFiles=C:\Program Files
PROMPT=$P$G
PUBLIC=C:\users\Public
SESSIONNAME=Console
SystemDrive=c:
SYSTEMROOT=C:\windows
TEMP=C:\users\bruno\Temp
TMP=C:\users\bruno\Temp
USERDOMAIN=schrot
USERNAME=bruno
USERPROFILE=C:\users\bruno
windir=C:\windows
WINELOADERNOEXEC=1
winsysdir=C:\windows\system32

Дальнейшие исследования показывают, что os.environ уже инициализируется posixmodule.c в реализации cpython.

Я бы согласился с обходным решением, но если я действительно попытаюсь удалить переменную '' в python, класс os.environ не сможет этого сделать, поскольку '' считается недопустимой переменной:

>>> del os.environ['']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Program Files\Miniconda3\lib\os.py", line 738, in __delitem__
    del self._data[encodedkey]
  File "C:\Program Files\Miniconda3\lib\os.py", line 776, in <lambda>
    if "unsetenv" not in __all__:
OSError: [Errno 0] Error

Есть ли у вас какие-либо предложения о том, как обойти эту проблему (я могу заполнить это как отчет об ошибке в usptream python или, возможно, Wine, но я бы хотел, чтобы он работал пока что)

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Похоже на работу для модуля sitecustomize.Из документации Python ( Модули настройки ):

[…] Теперь вы можете создать файл с именем usercustomize.py в этом каталоге и поместить в него все, что захотите.Он будет влиять на каждый вызов Python, если он не запущен с опцией -s для отключения автоматического импорта.

sitecustomize работает аналогично, но обычно создается администратором компьютера вглобальный каталог site-packages и импортируется до usercustomize.См. Документацию модуля site для получения более подробной информации.

Поэтому поиск глобального каталога site-packages для вашей установки Python и создание sitecustomize.py со следующим содержимым исправятпроблема для каждого скрипта в одном месте:

import os
del os.environ._data['']
0 голосов
/ 24 августа 2018

Я решил, что уродливое решение состоит в том, чтобы выполнить следующие действия и запустить каждый скрипт python:

del os.environ._data['']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...