Problem to execute a mkvmerge command in python

Hi,

i’m wrting a script to replace a video track in a file video with another video track in another file video

if i run this command in dos prompt, works very good:

.\bin\mkvtoolnix\mkvmerge.exe" --ui-language it --priority lower --output ^"G:\Python Scripts\video_test\Output_Folder\Educazione Criminale - She Rides Shotgun ^(2025^) multitraccia 2 minuti_DV.mkv^" --no-video --language 1:it --track-name ^"1:Italiano AC-3 5.1^" --language 2:en --track-name ^"2:English AC-3 5.1^" --sub-charset 3:UTF-8 --language 3:it --track-name ^"3:Italiano Forced Verdi^" --sub-charset 4:UTF-8 --language 4:it --track-name ^"4:Italiano Forced Bianchi^" --sub-charset 5:UTF-8 --language 5:it --track-name 5:Italiano --sub-charset 6:UTF-8 --language 6:en --track-name 6:English --sub-charset 7:UTF-8 --language 7:en --track-name ^"7:English for Deaf^" ^"^(^" ^"G:\Python Scripts\video_test\Educazione Criminale - She Rides Shotgun ^(2025^) multitraccia 2 minuti.mkv^" ^"^)^" --language 0:it --track-name ^"0:Video 2160p^" ^"^(^" ^".\temp\Educazione Criminale - She Rides Shotgun ^(2025^) multitraccia 2 minuti_DV.hevc^" ^"^)^" --title ^"Educazione Criminale - She Rides Shotgun ^(2025^) multitraccia 2 minuti^" --track-order 1:0,0:1,0:2,0:3,0:4,0:5,0:6,0:7

but if i use this command in python with subprocess.Popen i get error, don’t works

can anyone help me solve this problem?

Welcome!

Given how assinine escaping is for cmd.exe I recommend you write all arguments to a JSON file & run only run mkvmerge @path\to\args.json

The JSON file would then be something like

[
  "--ui-language", "it",
  "--priority", "lower",
  "--output", "C:\\Python Scripts\\…"
]

You can use Python’s built-in JSON support to create that file easily from a Python array.

If you want actual, concrete advice about what’s wrong with your actual script, you’ll have to show the actual script; otherwise we can only guess what you wrote & where you went wrong.

Thank you for your answer, this my script:

comando_c="\".\\bin\\mkvtoolnix\\mkvmerge.exe\" --ui-language it --priority lower --output ^\"G:\\Python Scripts\\video_test\\Output_Folder\\Educazione Criminale - She Rides Shotgun ^(2025^) multitraccia 2 minuti_DV.mkv^\" --no-video --language 1:it --track-name ^\"1:Italiano AC-3 5.1^\" --language 2:en --track-name ^\"2:English AC-3 5.1^\" --sub-charset 3:UTF-8 --language 3:it --track-name ^\"3:Italiano Forced Verdi^\" --sub-charset 4:UTF-8 --language 4:it --track-name ^\"4:Italiano Forced Bianchi^\" --sub-charset 5:UTF-8 --language 5:it --track-name 5:Italiano --sub-charset 6:UTF-8 --language 6:en --track-name 6:English --sub-charset 7:UTF-8 --language 7:en --track-name ^\"7:English for Deaf^\" ^\"^(^\" ^\"G:\\Python Scripts\\video_test\\Educazione Criminale - She Rides Shotgun ^(2025^) multitraccia 2 minuti.mkv^\" ^\"^)^\" --language 0:it --track-name ^\"0:Video 2160p^\" ^\"^(^\" ^\".\\temp\\Educazione Criminale - She Rides Shotgun ^(2025^) multitraccia 2 minuti_DV.hevc^\" ^\"^)^\" --title ^\"Educazione Criminale - She Rides Shotgun ^(2025^) multitraccia 2 minuti^\" --track-order 1:0,0:1,0:2,0:3,0:4,0:5,0:6,0:7"
print(comando_c)


panel.m_textCtrl1.write("Sostituzione Traccia Video Originale\n")
panel.m_textCtrl1.write("con quella Dolby Vision Iniziata...\n\n")

p = subprocess.Popen(comando_c, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)

while True:
    line = p.stdout.readline()
    if line.strip() == "":
       pass
    else:
       panel.m_textCtrl1.write(line)
    if not line:
       break
p.kill()

codice_ritorno = p.wait()

panel.m_textCtrl1.write("\nSostituzione Traccia Video Terminata!!!\n\n")

And what’s the actual error you get?

Invalid track ID specified in ‘–track-name ^1:Italiano AC-3 5.1^’

Yeah that’s a quoting/escaping issue. Use JSON option files as I’ve written above. See the documentation for more information.

is it correct?

[
    "--ui-language", "it",
    "--priority", "lower",
    "--output", "G:\\Python Scripts\\video_test\\Output_Folder\\Educazione Criminale - She Rides Shotgun (2025) multitraccia 2 minuti_DV.mkv",
    "--no-video",
    "--language", "1:it",
    "--track-name", "1:Italiano AC-3 5.1",
    "--language", "2:en",
    "--track-name", "2:English AC-3 5.1",
    "--sub-charset", "3:UTF-8",
    "--language", "3:it",
    "--track-name", "3:Italiano Forced Verdi",
    "--sub-charset", "4:UTF-8",
    "--language", "4:it",
    "--track-name", "4:Italiano Forced Bianchi",
    "--sub-charset", "5:UTF-8",
    "--language", "5:it", 
    "--track-name", "5:Italiano",
    "--sub-charset", "6:UTF-8",
    "--language", "6:en",
    "--track-name", "6:English",
    "--sub-charset", "7:UTF-8",
    "--language", "7:en", 
    "--track-name", "7:English for Deaf",
    "G:\\Python Scripts\\video_test\\Educazione Criminale - She Rides Shotgun ^(2025^) multitraccia 2 minuti.mkv",
    "--language", "0:it", 
    "--track-name", "0:Video 2160p",
    ".\\temp\\Educazione Criminale - She Rides Shotgun (2025) multitraccia 2 minuti_DV.hevc",
    "--title", "Educazione Criminale - She Rides Shotgun (2025) multitraccia 2 minuti",
    "--track-order", "1:0,0:1,0:2,0:3,0:4,0:5,0:6,0:7"
]

ok system with json works very good

thank you very much :grinning_face: :clap:t5:

You’re very welcome.