在Wine设置的环境变量下使用空字符串名运行的Python 3.5.5

时间:2018-08-24 11:07:47

标签: python wine

嗨,我需要在Wine下运行Python(在CI上进行部署),并且遇到以下奇怪的行为。 如果我按如下方式在wine中运行python解释器(清除linux env):

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代码(例如,子进程模块实际上对此进行了检查并在拥有无效环境变量的情况下死亡)。

如果我使用SET检查实际的Windows环境,则不会得到此变量:

$ 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 :(得分:0)

我发现一个丑陋的解决方法是按照以下步骤开始每个python脚本:

del os.environ._data['']

答案 1 :(得分:0)

看起来像sitecustomize模块的工作。从Python文档(The Customization Modules):

  

[…]现在,您可以在该目录中创建一个名为usercustomize.py的文件,并将所需的任何内容放入其中。除非使用-s选项启动以禁用自动导入,否则它将影响Python的每次调用。

     

sitecustomize的工作方式相同,但通常由计算机的管理员在全局site-packages目录中创建,并在usercustomize之前导入。有关更多详细信息,请参见site模块的文档。

因此,为您的Python安装找到全局site-packages目录,并创建一个包含以下内容的sitecustomize.py,可以在一个地方解决每个脚本的问题:

import os
del os.environ._data['']