Почему в моей программе для скачивания видео с YouTube на Python вылетает ошибка?

import pytube
import time
import sys
import threading

SAVE_PATH = "download_vidio" 
link = "https://www.youtube.com/watch?v=6JLXHxSXYkA"

def planet_vpn():
    import planet_vpn
    client = planet_vpn.Client()
    ip_data=client.my_ip()
#planet_vpn()
def progres_bar():
    toolbar_width = 55
    sys.stdout.write("[%s]" % (" " * toolbar_width))
    sys.stdout.flush()
    sys.stdout.write("\b" * (toolbar_width+1)) # return to start of line, after '['
    for i in range(toolbar_width):
        time.sleep(0.1) # do real work here
        # update the bar
        sys.stdout.write("-")
        sys.stdout.flush()
    sys.stdout.write("]\n") # this ends the progress bar``
    # пробуем скачать видео по ссылке

def download(link):
    try: 
        youtubelink=pytube.YouTube(link)
        # получаем ссылку на видео с самым высоким качеством
        video=youtubelink.streams.get_highest_resolution()
        # скачиваем видео
        video.download(SAVE_PATH)
        print('скачено')
    # если скачать не получилось
    except:
        # выводим сообщение об ошибке
        print("Ссылка не работает")

if __name__ =="__main__":
    t1 = threading.Thread(target=progres_bar)
    t2 = threading.Thread(target=download, args=(link))

    t1.start()
    t2.start()
    t1.join()
    t2.join()
    print("Done!")

выдает ошибку:

[]Exception in thread Thread-2 
(download):
Traceback (most recent call last):
  File "C:\Users\User\AppData\Local\Programs\Python\Python312\Lib\threading.py", line 1073, 
in _bootstrap_inner
   self.run()
 File "C:\Users\User\AppData\Local\Programs\Python\Python312\Lib\threading.py", line 1010, 
in run
    self._target(*self._args, **self._kwargs)
TypeError: download() takes 1 positional argument but 43 were given
-------------------------------------------------------]
Done!

Ответы (1 шт):

Автор решения: CrazyElf

args=(link) - в такой записи скобки никакой роли не играют, это тоже самое, что args=link, а поскольку ожидается коллекция args is a list or tuple of arguments for the target invocation, то link превращается в кортеж из отдельных букв, который и передаётся в download в качестве отдельных параметров, одна буква - один параметр, вот и получается 43 аргумента функции вместо одного.

Поставьте запятую и будет вам правильная передача параметров в виде кортежа из одного элемента: args=(link,)

→ Ссылка