Как передать жестко запрограммированный код youtube-dl и переменную tkinter в командную строку - PullRequest
0 голосов
/ 06 июня 2019

Я пытаюсь вставить URL-адрес видео YouTube в текстовое поле GUI tkinter, и кнопка «Обзор» инициирует вызов подпроцесса, который принимает жестко запрограммированный код youtube-dl, и добавляет URL-адрес текстового поля. Кажется, я не могу передать жестко запрограммированный код Youtube-dl и переменную в командную строку.

Погуглил несколько вещей, чтобы найти ответы, но не могу найти ни одного ...

from tkinter import *
import tkinter as tk
from tkinter import ttk
import os
import subprocess


root = Tk()
root.geometry("900x800")    
Title = root.title( "JJ's Youtube Downloader")
PathTextBox = Text(root,height =  2)
PathTextBox.grid(row = 4,column = 1,columnspan = 2)
path = PathTextBox.get('1.0',END)
def download():
    import subprocess
    subprocess.call(["youtube-dl -x --audio-format mp3 ", path])


BrowseButton = Button(root,text="Browse ",command = download)
BrowseButton.grid(row = 2,column = 2)

root.configure(background='ivory2')
HeadLabel1 = Label(root,text="Image ")
HeadLabel1.grid(row = 1,column = 1,sticky=(E))
HeadLabel2 = Label(root,text="Reader ")
HeadLabel2.grid(row = 1,column = 2,sticky=(W))
InputLabel = Label(root,text = "INPUT IMAGE")
InputLabel.grid(row = 2, column = 1)


PathLabel = Label(root,text = "Path:")
PathLabel.grid(row = 3,column = 1,sticky=(W))



DataLabel = Label(root,text = "DATA IN IMAGE:")
DataLabel.grid(row = 6,column = 1,sticky=(W+E+N+S))
ResultTextBox = Text(root,height = 30,padx = 1, pady = 1)
ResultTextBox.grid(row = 7,column = 1,columnspan = 4,padx=3, 
pady=3,sticky=W+E+N+S)

root.mainloop()

КОД ОШИБКИ, КОТОРЫЙ Я ПОЛУЧАЮ Исключение в обратном вызове Tkinter Traceback (последний вызов был последним): файл "C: \ Users \ hutch \ AppData \ Local \ Programs \ Python \ Python37 \ lib \ tkinter__init __. Py", строка 1705, в вызов вернуть self.func (* аргументы) Файл "C: \ Users \ hutch \ Downloads \ Desktop \ PythonPrograms \ YoutubeDownloader.py", строка 17, в загрузке subprocess.call (["youtube-dl -x --audio-format mp3", путь]) Файл "C: \ Users \ hutch \ AppData \ Local \ Programs \ Python \ Python37 \ lib \ subprocess.py", строка 323, в вызове с Popen (* popenargs, ** kwargs) в качестве p: Файл "C: \ Users \ hutch \ AppData \ Local \ Programs \ Python \ Python37 \ lib \ subprocess.py", строка 775, в init restore_signals, start_new_session) Файл "C: \ Users \ hutch \ AppData \ Local \ Programs \ Python \ Python37 \ lib \ subprocess.py", строка 1178, в _execute_child STARTUPINFO) FileNotFoundError: [WinError 2] Системе не удается найти указанный файл

1 Ответ

0 голосов
/ 06 июня 2019

Вместо необходимости вызывать youtube-dl в качестве подпроцесса, вы можете импортировать сам youtube-dl непосредственно из PyPI и использовать его так же, как любую другую библиотеку Python.

Вы можете добавить его в свою среду Python, запустив pip install youtube_dl в своем терминале / командной строке, а затем вызвать YoutubeDL.download() из своего скрипта. Чтобы использовать аргументы командной строки, которые вы включили в строку подпроцесса, вы можете попробовать следующее (этот пример немного изменен из документации , он загрузит звуковую дорожку из вашего видео, а затем преобразует в MP3, делает почти то же самое, что и определение -x в аргументах командной строки)

import youtube_dl

ydl_opts = {
    'format': 'bestaudio/best',
    'postprocessors': [{
        'key': 'FFmpegExtractAudio',
        'preferredcodec': 'mp3',
        'preferredquality': '192',
    }]
}
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
    ydl.download([path])
...