python3.5.5运行在Wine sets环境变量下,使用空字符串nam

2024-04-25 02:22:44 发布

您现在位置:Python中文网/ 问答频道 /正文

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

env -i wine cmd /C python

我把这个放进去操作系统环境公司名称:

^{pr2}$

如您所见,有一个键为“”的变量,这是一个问题,因为很多python代码(例如,subprocess模块实际上会检查该变量,并在环境变量无效的情况下死亡)。在

如果我使用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

进一步调查表明操作系统环境已经由cpython实现中的posixmodule.c初始化。在

如果我真的尝试删除python中的“”变量操作系统环境类阻止这样做,因为“”被视为无效变量:

>>> 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

您对如何解决这个问题有什么建议吗(我可以将此报告作为bug报告提交给ustream python或Wine,但我希望同时让它正常工作)


Tags: inenvcmd环境windowsfilesprogramprocessor
2条回答

我认为一个难看的解决方法是执行以下操作并启动每个python脚本:

del os.environ._data['']

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

[…] Now you can create a file named usercustomize.py in that directory and put anything you want in it. It will affect every invocation of Python, unless it is started with the -s option to disable the automatic import.

sitecustomize works in the same way, but is typically created by an administrator of the computer in the global site-packages directory, and is imported before usercustomize. See the documentation of the site module for more details.

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

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

相关问题 更多 >