为什么我的 .env 文件中的变量在从我的 Python 脚本中更改后仍会重置为原始文件?

Why are the variables inside my .env file resetting to the original file even after changing it from inside my Python script?

我正在尝试使用以下结构为我的原始脚本实施检查点机制:

import os
import sys
from dotenv import load_dotenv

def main():
    load_dotenv()

    checkpoint = int(os.getenv('CHECKPOINT'))

    if checkpoint == 0:
        ...
        do something
        ...
        checkpoint += 1
        os.environ['CHECKPOINT'] = str(checkpoint)

    checkpoint = int(os.getenv('CHECKPOINT'))

    if checkpoint >= 1:
        ...
        do something
        ...
        checkpoint += 1
        os.environ['CHECKPOINT'] = str(checkpoint)

我的.env文件

CHECKPOINT=0

虽然此方法在 Windows 机器(localhost)中有效,但它不适用于我的 Ubuntu 服务器。

也就是说,如果我的代码在检查点 2 的某处失败,我应该只能从该点重新运行它。

例如,如果代码在检查点=2 处失败:

Windows机器:

checkpoint=2

Ubuntu机器:

checkpoint=0

此外,我正在使用 try 和 except 从代码中捕获失败,然后退出系统,如果有任何使用:

sys.exit()

我可以不时使用 config.json 来设置这些,但我真的很想知道为什么会这样。

这是一个最小的工作示例:

import os


name = 'CHECKPOINT'


def getenv():
    return int(os.getenv(name) or 0)


def putenv(value):
    print(f'{name} (before): {getenv()}')
    os.environ[name] = str(value)
    print(f'{name} (after {value}): {getenv()}')
    return getenv()


checkpoint = getenv()
if checkpoint == 0:
    checkpoint = putenv(checkpoint + 1)
if checkpoint >= 1:
    checkpoint = putenv(checkpoint + 1)

当你调用它时:

$ CHECKPOINT=1 python3 1.py 
CHECKPOINT (before): 1
CHECKPOINT (after setting 2): 2
$ echo -n $CHECKPOINT
$ python3 1.py 
CHECKPOINT (before): 0
CHECKPOINT (after setting 1): 1
CHECKPOINT (before): 1
CHECKPOINT (after setting 2): 2

CHECKPOINT 环境变量未保留,因为它存储在退出的第一个进程 (python3 1.py) 中。