我对带有反斜杠的环境变量有疑问。我有:
NETWORK=\\TI\folder
但是在 Django 和 Celery 中,这个变量将以不同的方式解释:
Django: \\TI\folder
Celery: \TIfolder
为什么我有差异? Celery 和 Django 具有相同的 env 文件和环境。 Python 3.8
Django 和 Celery 对环境变量中反斜杠的解释差异主要源于它们加载环境变量的方式不同。
Django:
-
Django 使用 Python 的
os.environ
字典来访问环境变量。 -
os.environ
会将反斜杠 (\
) 解释为转义字符。 -
为了表示一个字面上的反斜杠,你需要使用双反斜杠 (
\\
)。
因此,在你的例子中,Django 正确地将
NETWORK
解释为
\\TI\folder
。
Celery:
-
Celery 使用
celery worker
命令启动 worker 进程。 - 当你直接从 shell 启动命令时,shell 会对命令行参数进行一层处理,包括环境变量。
-
在 Windows 系统中,shell 会将单个反斜杠解释为路径分隔符,并将其替换为正斜杠 (
/
)。 -
因此,当 Celery worker 接收到
NETWORK
环境变量时,它已经被 shell 处理过,变成了/TIfolder
。
解决方法:
为了解决这个问题,你可以使用以下任一方法:
- 使用正斜杠 (/):
-
将你的环境变量值改为使用正斜杠作为路径分隔符,例如
NETWORK=/TI/folder
。 -
这将确保 Django 和 Celery 都能正确解释路径。
-
使用原始字符串:
-
在定义环境变量时,使用 Python 原始字符串。例如:
python NETWORK=r'\\TI\folder'
-
这将阻止 Python 解释反斜杠为转义字符。
-
使用双反斜杠:
-
在你的环境变量值中使用双反斜杠,例如:
NETWORK=\\\\TI\\folder
- 虽然看起来很奇怪,但这能确保在经过 shell 处理后,Celery worker 能接收到正确的路径。
推荐方案:
为了避免混淆,建议在所有环境变量中都使用正斜杠 (
/
) 作为路径分隔符。这将确保跨平台兼容性,并避免 Windows 系统中特有的反斜杠问题。