如题:https://github.com/httprunner/httprunner/issues/1008
【命令行读取环境变量文件的参数在 3.* 版本不见了,希望加上 --dot-env-path】
不想用低版本,有没有办法绕过这个问题,改源码有点不现实。
def load_dot_env_file(dot_env_path: Text) -> Dict:
""" load .env file.
Args:
dot_env_path (str): .env file path
Returns:
dict: environment variables mapping
{
"UserName": "debugtalk",
"Password": "123456",
"PROJECT_KEY": "ABCDEFGH"
}
Raises:
exceptions.FileFormatError: If .env file format is invalid.
"""
if not os.path.isfile(dot_env_path):
return {}
logger.info(f"Loading environment variables from {dot_env_path}")
env_variables_mapping = {}
with open(dot_env_path, mode="rb") as fp:
for line in fp:
# maxsplit=1
if b"=" in line:
variable, value = line.split(b"=", 1)
elif b":" in line:
variable, value = line.split(b":", 1)
else:
raise exceptions.FileFormatError(".env format error")
env_variables_mapping[
variable.strip().decode("utf-8")
] = value.strip().decode("utf-8")
utils.set_os_environ(env_variables_mapping)
return env_variables_mapping
这个方法现在用不了了?
老项目最好不要升级版本了,httprunner 每个大版本升级都不兼容之前的用例,真是有点坑
解决了:生冷粗暴,弄一个 py 文件,读取配置文件然后全量替换.env 里的文本内容
def switch_env(filepath):
cur_path = os.path.dirname(os.path.abspath(''))
print("cur_path:",cur_path)
re_data=os.path.join(cur_path, filepath + ".txt")
env_file=os.path.join(cur_path,'.env')
#print("要替换的env:", re_data)
data_renew=""
with open(re_data, 'r',encoding="utf-8") as ff:
for line in ff:
line = line.strip()
#忽略配置文件的注释行
if not len(line) or line.startswith('#'):
continue
else:
data_renew += line+'\n'
print(data_renew)
with open(env_file,'w',encoding="utf-8") as f:
f.write(data_renew)
#print(data_renew)
return data_renew
if __name__ == "__main__":
#用于jenkins读取参数执行
filepath=sys.argv[1]
config=switch_env(filepath)
两个疑问
cur_path = os.path.dirname(os.path.abspath(''))
, 假设,被执行的文件在 com 目录下,如 com/main.py
, 那么在不同的目录中执行
python main.py
python com/main.py
cur_path
得到是同样的值么? 当然,即使不一样,应用场景锁定了,不一样也无所谓。
continue
看着有点奇怪啊,它后面什么代码都没有啊。 为什么 不直接写 pass
或者 ';'cur_path = os.path.dirname(os.path.abspath('')) 这个我就是把.env 和我用来替换的文件放在同一个目录下的。continue 那个也就是过滤一下 # 注释的内容,因为.env 文件格式校验很严格,必须要字典形式的不能掺杂注释。