由于pyinstaller打包后的二进制包执行时候,会修改依赖库搜索环境变量,如LD_LIBRARY_PATH 所以在启动Subprocess执行命令时候,可能会影响到项目编译状况 这里会返回启动二进制包之前的环境变量,提供给Subprocess使用 1. linux和*BSD下会将LD_LIBRARY_PATH备份为LD_LIBRARY_PATH_ORIG,然后将二进制包生成的目录补充在LD_LIBRARY_PATH前面 2. Aix下是LIBPATH和LIBPATH_ORIG 3. Mac下是
(self, os_env=None)
| 151 | EnvSetting.env_setting_init() |
| 152 | |
| 153 | def get_origin_env(self, os_env=None): |
| 154 | """ |
| 155 | 由于pyinstaller打包后的二进制包执行时候,会修改依赖库搜索环境变量,如LD_LIBRARY_PATH |
| 156 | 所以在启动Subprocess执行命令时候,可能会影响到项目编译状况 |
| 157 | 这里会返回启动二进制包之前的环境变量,提供给Subprocess使用 |
| 158 | 1. linux和*BSD下会将LD_LIBRARY_PATH备份为LD_LIBRARY_PATH_ORIG,然后将二进制包生成的目录补充在LD_LIBRARY_PATH前面 |
| 159 | 2. Aix下是LIBPATH和LIBPATH_ORIG |
| 160 | 3. Mac下是会unset掉DYLD_LIBRARY_PATH |
| 161 | 4. windows没有影响 |
| 162 | |
| 163 | :param os_env: 系统环境变量dict,如果参数有传递,直接使用参数来操作,而不从os.environ里面取 |
| 164 | :return: env <dict> |
| 165 | """ |
| 166 | if os_env: |
| 167 | env = os_env |
| 168 | else: |
| 169 | env = dict(os.environ) |
| 170 | |
| 171 | # 判断是否是pyinstaller包状态, 若是源码状态,则不处理 |
| 172 | if len(sys.argv) > 0 and sys.argv[0].endswith(".py"): |
| 173 | return env |
| 174 | |
| 175 | # Linux |
| 176 | if sys.platform == "linux" or sys.platform == "linux2": |
| 177 | lp_key = 'LD_LIBRARY_PATH' |
| 178 | # 收集需要的lp环境变量 |
| 179 | wanted_env_list = [] |
| 180 | # 收集现有进程的lp环境变量,剔除掉pyinstaller添加的临时运行目录,则为需要传递给子进程的环境变量 |
| 181 | cur_lp_value = env.get(lp_key) |
| 182 | if cur_lp_value: |
| 183 | cur_lp_list = cur_lp_value.split(os.pathsep) |
| 184 | for lp_value in cur_lp_list: |
| 185 | # 当前进程的lp环境变量,剔除掉pyinstaller添加的临时运行目录,其他的为需要的 |
| 186 | if not lp_value.startswith("/tmp/_MEI"): |
| 187 | wanted_env_list.append(lp_value) |
| 188 | if wanted_env_list: # 现有的lp已经包含_ORIG |
| 189 | env[lp_key] = os.pathsep.join(wanted_env_list) |
| 190 | logger.debug(f"{lp_key}={cur_lp_value}, change to {env[lp_key]}") |
| 191 | else: |
| 192 | env.pop(lp_key, None) |
| 193 | logger.debug(f"{lp_key}={cur_lp_value}, delete it.") |
| 194 | |
| 195 | # Mac: |
| 196 | # 由于Mac下二进制包无法检测环境中环境变量原来是否有DYLD_LIBRARY_PATH,加上目前没有发现有项目遇到类似问题 |
| 197 | # 这里暂不做处理,继续观察 |
| 198 | |
| 199 | return env |
| 200 | |
| 201 | |
| 202 | class EnvSetting(object): |
no test coverage detected