如何根据 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,正是我所需要的。
程序现在运行良好。
这是一个令人困惑的问题,但我会尽量把它说清楚。 目前,当我构建我的应用程序时,如果我通过 .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,正是我所需要的。
程序现在运行良好。