`set_key` does not handle single quote `'` inside value properly

Author: YuryHrytsukCreated Dec 17, 2024Updated Aug 16, 2026

Problem

set_key function does not properly handle single quote ' inside value.

python-dotenv version: 1.0.1

Related PR

How to reproduce

  1. Run python script below
  2. Run source .env

Python Script

python
from dotenv import set_key

def main():
    var_value = "I'm a bug :("
    set_key(".env", "VAR", var_value)


if __name__ == "__main__":
    main()

Error from source .env

bash
bash: .env: line 1: syntax error near unexpected token `('
bash: .env: line 1: `VAR='I\'m a bug :(''

Example of fix

:warning: this fix produces values that dotenv cannot parse (see this issue) :warning:

python
from dotenv import set_key

def fixed_set_key(file_path, key, value):
    # properly escape ' if present
    # https://stackoverflow.com/questions/8254120/how-can-i-escape-a-single-quote-in-a-single-quote-string-in-bash/26165123#26165123
    value = value.replace("'", "'\"'\"'")
    
    set_key(file_path, key, f"'{value}'", quote_mode="never")

def main():
    var_value = "I'm a fixed :)"
    fixed_set_key(".env", "VAR", var_value)


if __name__ == "__main__":
    main()