【问题标题】:How to set a dictionary based off of subprocess.check_output如何根据 subprocess.check_output 设置字典
【发布时间】:2020-10-24 17:37:06
【问题描述】:

这是一个令人困惑的问题,但我会尽量使其清楚。 目前,当我构建我的应用程序时,如果我通过 .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 检查文件中的音轨数量。它返回像这样的值

1
2
3

如果有 3 首曲目。或者

1 
2

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

所以我正在获取该结果并定义一个字典来自动填充/更改 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 标志,程序运行正确,显示轨迹。

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

【问题讨论】:

    标签: python-3.x tkinter ffmpeg subprocess ffprobe


    【解决方案1】:

    这篇文章就是答案。特别是第二篇文章,正是我所需要的。

    subprocess seems not working in pyinstaller exe file

    程序现在运行良好。

    【讨论】:

      猜你喜欢
      • 2017-09-16
      • 1970-01-01
      • 2016-03-31
      • 1970-01-01
      • 2011-05-15
      • 2021-12-18
      • 2020-10-20
      • 2015-10-30
      • 2021-02-19
      相关资源
      最近更新 更多