如何根据 subprocess.check_output 设置字典

How to set a dictionary based off of subprocess.check_output

这是一个令人困惑的问题,但我会尽量把它说清楚。 目前,当我构建我的应用程序时,如果我通过 .py 文件 运行 它可以完美运行。但是,一旦我编译它,我的应用程序的某些部分就无法运行,特别是这里的这段代码。

def ffprobe_run():
global output
global acodec_choices
run = subprocess.check_output("ffprobe " + videoinputquoted + " " + ffprobecommand, universal_newlines=True)
print(run)
if run[-2] == '3':
    acodec_choices = {"One": "1",
                      "Two": "2",
                      "Three": "3"}
elif run[-2] == '2':
    acodec_choices = {"One": "1",
                      "Two": "2",}
elif run[-2] == '1':
    acodec_choices = {"One": "1",}
print(acodec_choices.values())

我可以用这个命令得到我想要的结果。目前,它正在使用 FFPROBE 检查文件中的音轨数量。它 returns 值像这样

1
2
3

如果有3条轨道。或者

1 
2

如果是两条轨道。我使用命令[-2] 这将给我 '2'

的结果

所以我正在获取该结果并定义一个字典以自动 populate/change 一个 OptionMenu

它在我的主应用程序中定义了这个

 # Audio Stream Selection
    acodec_stream = StringVar(audio_window)
    if ffprobeinfo[-2] == '1':
        acodec_stream_choices = {'Track 1': "-map 0:a:0"}
    elif ffprobeinfo[-2] == '2':
        acodec_stream_choices = {'Track 1': "-map 0:a:0",
                                 'Track 2': "-map 0:a:1"}
    elif ffprobeinfo[-2] == '3':
        acodec_stream_choices = {'Track 1': "-map 0:a:0",
                                 'Track 2': "-map 0:a:1",
                                 'Track 3': "-map 0:a:2"}
    elif ffprobeinfo[-2] == '4':
        acodec_stream_choices = {'Track 1': "-map 0:a:0",
                                 'Track 2': "-map 0:a:1",
                                 'Track 3': "-map 0:a:2",
                                 'Track 4': "-map 0:a:3"}
    elif ffprobeinfo[-2] == '5':
        acodec_stream_choices = {'Track 1': "-map 0:a:0",
                                 'Track 2': "-map 0:a:1",
                                 'Track 3': "-map 0:a:2",
                                 'Track 4': "-map 0:a:3",
                                 'Track 5': "-map 0:a:4"}
    elif ffprobeinfo[-2] == '6':
        acodec_stream_choices = {'Track 1': "-map 0:a:0",
                                 'Track 2': "-map 0:a:1",
                                 'Track 3': "-map 0:a:2",
                                 'Track 4': "-map 0:a:3",
                                 'Track 5': "-map 0:a:4",
                                 'Track 6': "-map 0:a:5"}
    elif ffprobeinfo[-2] == '7':
        acodec_stream_choices = {'Track 1': "-map 0:a:0",
                                 'Track 2': "-map 0:a:1",
                                 'Track 3': "-map 0:a:2",
                                 'Track 4': "-map 0:a:3",
                                 'Track 5': "-map 0:a:4",
                                 'Track 6': "-map 0:a:5",
                                 'Track 7': "-map 0:a:6"}
    elif ffprobeinfo[-2] == '8':
        acodec_stream_choices = {'Track 1': "-map 0:a:0",
                                 'Track 2': "-map 0:a:1",
                                 'Track 3': "-map 0:a:2",
                                 'Track 4': "-map 0:a:3",
                                 'Track 5': "-map 0:a:4",
                                 'Track 6': "-map 0:a:5",
                                 'Track 7': "-map 0:a:6",
                                 'Track 8': "-map 0:a:7"}
    elif ffprobeinfo[-2] == '9':
        acodec_stream_choices = {'Track 1': "-map 0:a:0",
                                 'Track 2': "-map 0:a:1",
                                 'Track 3': "-map 0:a:2",
                                 'Track 4': "-map 0:a:3",
                                 'Track 5': "-map 0:a:4",
                                 'Track 6': "-map 0:a:5",
                                 'Track 7': "-map 0:a:6",
                                 'Track 8': "-map 0:a:7",
                                 'Track 9': "-map 0:a:8"}
    elif ffprobeinfo[-2] == '10':
        acodec_stream_choices = {'Track 1': "-map 0:a:0",
                                 'Track 2': "-map 0:a:1",
                                 'Track 3': "-map 0:a:2",
                                 'Track 4': "-map 0:a:3",
                                 'Track 5': "-map 0:a:4",
                                 'Track 6': "-map 0:a:5",
                                 'Track 7': "-map 0:a:6",
                                 'Track 8': "-map 0:a:7",
                                 'Track 9': "-map 0:a:8",
                                 'Track 10': "-map 0:a:9"}
    acodec_stream.set('Track 1')  # set the default option
    acodec_stream_label = Label(audio_window, text="Track :")
    acodec_stream_label.grid(row=0, column=0, columnspan=1, padx=5, pady=5)
    acodec_stream_menu = OptionMenu(audio_window, acodec_stream, *acodec_stream_choices.keys())
    acodec_stream_menu.grid(row=1, column=0, columnspan=1, padx=5, pady=5)

如果我通过 .py 文件运行安装应用程序,一切都很好。一旦我编译它就丢失了整个定义的字典选择。

这就是它应该看起来的样子 enter image description here

但是,上面的代码看起来是这样的。 enter image description here

如果我自己定义字典,它工作正常。但是,我无法自动输入正确数量的可用音轨。

我希望这不是太多代码。我对此很陌生。

编辑:

如果我通过 pyinstaller 编译并删除 -w 标志,程序 运行s 正确显示曲目。

我假设我没有正确使用 subprocess/calling 某些东西。我不认为程序在没有控制台时调用 FFPROBE,而不是在它有自己的控制台时调用它并获取值。

这个post就是答案。特别是第二个 post,正是我所需要的。

程序现在运行良好。