Привет! Мне нужно запустить 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, но я бы хотел, чтобы он работал пока что)