Получаю ошибку: File "C:\Python37-32\download\download_m3u.py", line 87, in <module> main(sys.argv[0:])

satfan

Пользователь
Пользователь
Апр 21, 2020
98
6
8
Windows 7 Starter
Python37-32
Скрипт запускаю в папке: C:\Python37-32\download
===========================================
# -*- coding: utf-8 -*-
#!/usr/bin/env python3
import sys
import urllib
import urllib.request
import urllib.error
import os
from urllib.parse import urlparse

def get_url_nofollow(url, pathTo):
try:
urllib.request.urlretrieve (url, pathTo)
return 1
except urllib.error.HTTPError as e:
return 0
except:
return 0

def main(args):
urls = []
# urls = {}

arguments = len(args) - 1

filepath1 = 'printer1.mu3'
filepath2 = 'err.mu3'
if arguments > 1:
filepath1 = args[1]
if arguments >= 2:
chan = args[2]
if arguments >= 3:
filepath2 = args[3]

plist = "plist.m3u"
plistF = open(plist, "w", encoding = "utf-8")

with open(filepath1, encoding = "utf-8") as fp:
line = fp.readline()
cnt = 1
while line:
line = line.strip()
line = line.strip('\n')
line = line.strip('\r')
a = urlparse(line)
pathTo = filepath2 + '\%s' % os.path.basename(a.path)
out = get_url_nofollow(line, pathTo)
if (out != 1):
print("not found - " + line)
else:
urls.append(pathTo)

line = fp.readline()

fp.close()

with open(chan, encoding = "utf-8") as fc:
chName = fc.readline()
while chName:
chName = chName.strip()
chName = chName.strip('\n')
chName = chName.strip('\r')
print(chName)

for url in urls:
# print(url)
with open(url, encoding = "utf-8") as fo:
line = fo.readline()
# print(line)
cnt = 1
while line:

if (line.find(chName) != -1):
plistF.write(line)
line = fo.readline()
plistF.write(line)

line = fo.readline()

fo.close()

chName = fc.readline()

fc.close()
plistF.close()

if __name__ == "__main__":
main(sys.argv[0:])
===================================
Выдало ошибки:
============== RESTART: C:\Python37-32\download\download_m3u.py ==============
Traceback (most recent call last):
File "C:\Python37-32\download\download_m3u.py", line 87, in <module>
main(sys.argv[0:])
File "C:\Python37-32\download\download_m3u.py", line 56, in main
with open(chan, encoding = "utf-8") as fc:
UnboundLocalError: local variable 'chan' referenced before assignment
>>>
 

satfan

Пользователь
Пользователь
Апр 21, 2020
98
6
8
Извините ответ дал выше -- ошибся.

Ошибка в коде"error binding parameter 0 probably unsupported type."
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
UnboundLocalError: local variable 'chan' referenced before assignment
Код вставляйте через кнопку ... -> код -> python.
В том виде в котором вы его сейчас написали непонятно как располагаются отступы и соответственно непонятна правильная вложенность.
Насчет ошибки: в 56й строке происходит обращение к переменной chan, значение которой не определено.
 

satfan

Пользователь
Пользователь
Апр 21, 2020
98
6
8
Python:
# -*- coding: utf-8 -*-
#!/usr/bin/env python3
import sys
import urllib
import urllib.request
import urllib.error
import os
from urllib.parse import urlparse

def get_url_nofollow(url, pathTo):
    try:
        urllib.request.urlretrieve (url, pathTo)
        return 1
    except urllib.error.HTTPError as e:
        return 0
    except:
        return 0

def main(args):
    urls = []
    # urls = {}
    
    arguments = len(args) - 1

    filepath1 = 'printer1.mu3'
    filepath2 = 'err.mu3'
    if arguments > 1:
        filepath1 = args[1]
    if arguments >= 2:
        chan = args[2]
    if arguments >= 3:
        filepath2 = args[3]
        
    plist = "plist.m3u"
    plistF = open(plist, "w", encoding = "utf-8")
    
    with open(filepath1, encoding = "utf-8") as fp:
        line = fp.readline()
        cnt = 1
        while line:
            line = line.strip()
            line = line.strip('\n')
            line = line.strip('\r')
            a = urlparse(line)
            pathTo = filepath2 + '\%s' % os.path.basename(a.path)
            out = get_url_nofollow(line, pathTo)
            if (out != 1):
                print("not found - " + line)
            else:
                urls.append(pathTo)
            
            line = fp.readline()
            
    fp.close()

    with open(chan, encoding = "utf-8") as fc:
        chName = fc.readline()
        while chName:
            chName = chName.strip()
            chName = chName.strip('\n')
            chName = chName.strip('\r')
            print(chName)
            
            for url in urls:
                # print(url)
                with open(url, encoding = "utf-8") as fo:
                    line = fo.readline()
                    # print(line)
                    cnt = 1
                    while line:
                        
                        if (line.find(chName) != -1):
                            plistF.write(line)
                            line = fo.readline()
                            plistF.write(line)
                            
                        line = fo.readline()
                
                fo.close()
                
            chName = fc.readline()
        
    fc.close()
    plistF.close()
    
if __name__ == "__main__":
    main(sys.argv[0:])
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Про ошибку я уже выше написал. Исправить можно добавлением проверки значения переменной chan.
Python:
#...
chan = None
if arguments > 1:
    filepath1 = args[1]
if arguments >= 2:
    chan = args[2]
if arguments >= 3:
    filepath2 = args[3]
    
#...
if chan is not None:
    with open(chan, encoding = "utf-8") as fc:
#...
 

satfan

Пользователь
Пользователь
Апр 21, 2020
98
6
8
Уважаемый
stud_55
===========
Я только начинаю. Скрипт мне прислал друг. Он сейчас не сможет ответить.
Подскажите как мне исправить ?
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Подскажите как мне исправить ?
Я выше уже написал как исправить, вот полный код:
Python:
import sys
import urllib
import urllib.request
import urllib.error
import os
from urllib.parse import urlparse


def get_url_nofollow(url, pathTo):
    try:
        urllib.request.urlretrieve (url, pathTo)
        return 1
    except urllib.error.HTTPError as e:
        return 0
    except:
        return 0

def main(args):
    urls = []

    arguments = len(args) - 1

    chan = None

    filepath1 = 'printer1.mu3'
    filepath2 = 'err.mu3'
    if arguments > 1:
        filepath1 = args[1]
    if arguments >= 2:
        chan = args[2]
    if arguments >= 3:
        filepath2 = args[3]

    plist = "plist.m3u"
    plistF = open(plist, "w", encoding="utf-8")
    
    with open(filepath1, encoding="utf-8") as fp:
        line = fp.readline()
        cnt = 1
        while line:
            line = line.strip()
            line = line.strip('\n')
            line = line.strip('\r')
            a = urlparse(line)
            pathTo = filepath2 + '\%s' % os.path.basename(a.path)
            out = get_url_nofollow(line, pathTo)
            if (out != 1):
                print("not found - " + line)
            else:
                urls.append(pathTo)
            
            line = fp.readline()
            
    fp.close()

    if chan is not None:
        with open(chan, encoding="utf-8") as fc:
            chName = fc.readline()
            while chName:
                chName = chName.strip()
                chName = chName.strip('\n')
                chName = chName.strip('\r')
                print(chName)

                for url in urls:
                    with open(url, encoding="utf-8") as fo:
                        line = fo.readline()
                        cnt = 1
                        while line:
                            
                            if (line.find(chName) != -1):
                                plistF.write(line)
                                line = fo.readline()
                                plistF.write(line)
                                
                            line = fo.readline()
                    
                    fo.close()
                    
                chName = fc.readline()
            
        fc.close()
        plistF.close()
    
if __name__ == "__main__":
    main(sys.argv[0:])
 

satfan

Пользователь
Пользователь
Апр 21, 2020
98
6
8
Уважаемый
stud_55
=================
Ваш исправленный скрипт выдал:
>>>
Warning (from warnings module):
File "C:\Python38-32\Скачатьm3u\download_m3u.py", line 45
pathTo = filepath2 + '\%s' % os.path.basename(a.path)
SyntaxWarning: invalid escape sequence \%
>>>
============= RESTART: C:\Python38-32\Скачатьm3u\download_m3u.py =============
>>>
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Ваш исправленный скрипт выдал:
SyntaxWarning: invalid escape sequence \%
Я только показал как исправить предыдущую ошибку. Остальной код не менял.
Чтобы исправить можете заменить эту строку:
Python:
pathTo = filepath2 + '\%s' % os.path.basename(a.path)
на такую:
Python:
pathTo = f'{filepath2}\{os.path.basename(a.path)}'
 

satfan

Пользователь
Пользователь
Апр 21, 2020
98
6
8
Уважаемый
@stud_55
=================
Заменил строку, как Вы сказали.
Опять ошибка:
============== RESTART: C:\Python37-32\download\download_m3u.py ==============
Traceback (most recent call last):
File "C:\Python37-32\download\download_m3u.py", line 87, in <module>
main(sys.argv[0:])
File "C:\Python37-32\download\download_m3u.py", line 56, in main
with open(chan, encoding = "utf-8") as fc:
UnboundLocalError: local variable 'chan' referenced before assignment
>>>
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Опять ошибка:
UnboundLocalError: local variable 'chan' referenced before assignment
Про то как ее исправить я выше уже писал и код приводил. Нужно определить переменную chan = None и потом проверять
if chan is not None:. Если эти строки будут в коде ошибки быть не должно.
 

satfan

Пользователь
Пользователь
Апр 21, 2020
98
6
8
Уважаемый
@stud_55
=================
Спасибо за помощь.
Я не смогу исправить. Для меня Ваше пояснение - сложно.
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Я не смогу исправить. Для меня Ваше пояснение - сложно.
Учите основы, гуглите.
Вот код с двумя исправленными ошибками:
Python:
import sys
import urllib
import urllib.request
import urllib.error
import os
from urllib.parse import urlparse


def get_url_nofollow(url, pathTo):
    try:
        urllib.request.urlretrieve(url, pathTo)
        return 1
    except urllib.error.HTTPError as e:
        return 0
    except:
        return 0


def main(args):
    urls = []

    arguments = len(args) - 1

    chan = None

    filepath1 = 'printer1.mu3'
    filepath2 = 'err.mu3'
    if arguments > 1:
        filepath1 = args[1]
    if arguments >= 2:
        chan = args[2]
    if arguments >= 3:
        filepath2 = args[3]


    plist = "plist.m3u"
    plistF = open(plist, "w", encoding="utf-8")


    with open(filepath1, encoding="utf-8") as fp:
        line = fp.readline()
        cnt = 1
        while line:
            line = line.strip()
            line = line.strip('\n')
            line = line.strip('\r')
            a = urlparse(line)
            pathTo = f'{filepath2}\{os.path.basename(a.path)}'
            out = get_url_nofollow(line, pathTo)
            if (out != 1):
                print("not found - " + line)
            else:
                urls.append(pathTo)
            
            line = fp.readline()

    if chan is not None:
        with open(chan, encoding="utf-8") as fc:
            chName = fc.readline()
            while chName:
                chName = chName.strip()
                chName = chName.strip('\n')
                chName = chName.strip('\r')
                print(chName)

                for url in urls:
                    with open(url, encoding="utf-8") as fo:
                        line = fo.readline()
                        cnt = 1
                        while line:
                            
                            if (line.find(chName) != -1):
                                plistF.write(line)
                                line = fo.readline()
                                plistF.write(line)
                                
                            line = fo.readline()  

                chName = fc.readline()
    plistF.close()


if __name__ == "__main__":
    main(sys.argv[0:])
 

satfan

Пользователь
Пользователь
Апр 21, 2020
98
6
8
Уважаемый
@stud_55
=================
Замучил я Вас.
Опять выдаёт ошибки:
>>>
Warning (from warnings module):
File "C:\Python38-32\Скачатьm3u\download_m3u.py", line 48
pathTo = f'{filepath2}\{os.path.basename(a.path)}'
SyntaxWarning: invalid escape sequence \{
>>>
============= RESTART: C:\Python38-32\Скачатьm3u\download_m3u.py =============
>>>
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Уважаемый
@stud_55
=================
Замучил я Вас.
Опять выдаёт ошибки:
>>>
Warning (from warnings module):
File "C:\Python38-32\Скачатьm3u\download_m3u.py", line 48
pathTo = f'{filepath2}\{os.path.basename(a.path)}'
SyntaxWarning: invalid escape sequence \{
>>>
============= RESTART: C:\Python38-32\Скачатьm3u\download_m3u.py =============
>>>
Попробуйте в последней версии кода заменить эту строку:
Python:
pathTo = f'{filepath2}\{os.path.basename(a.path)}'
на такую:
Python:
pathTo = f'{filepath2}\\{os.path.basename(a.path)}'
или если не сработает на такую:
Python:
pathTo = filepath2 + '\\' + str(os.path.basename(a.path))
 

satfan

Пользователь
Пользователь
Апр 21, 2020
98
6
8
Беру Ваш вариант исправленный - (Вот код с двумя исправленными ошибками: )
Заменяю поочерёдно как Вы сказали выше.
В обоих вариантах при запуске скрипта после замены указанной строки--- ничего не происходит.
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Беру Ваш вариант исправленный - (Вот код с двумя исправленными ошибками: )
Заменяю поочерёдно как Вы сказали выше.
В обоих вариантах при запуске скрипта после замены указанной строки--- ничего не происходит.
В смысле ничего не происходит - та же ошибка что-ли?
 

satfan

Пользователь
Пользователь
Апр 21, 2020
98
6
8
В IDLE (Python 3.8 32-bit) --- моргает курсор. Файлы m3u в папку: Скачатьm3u --- не грузятся.
Ошибок нет в обоих вариантах.
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
В IDLE (Python 3.8 32-bit) --- моргает курсор. Файлы m3u в папку: Скачатьm3u --- не грузятся.
Ошибок нет в обоих вариантах.
Ошибок нет. Скрипт не делает то что нужно - значит он не рабочий.
 

satfan

Пользователь
Пользователь
Апр 21, 2020
98
6
8
Автор скрипта мне велел делать так:
файл во вложении, запускать так:
python.exe download_m3u.py link1.txt channels.txt ИмяПапкиКудаСкладывать_m3u
=====================
Может я что-то не так делаю ?
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Автор скрипта мне велел делать так:
файл во вложении, запускать так:
python.exe download_m3u.py link1.txt channels.txt ИмяПапкиКудаСкладывать_m3u
=====================
Может я что-то не так делаю ?
Примеры файлов можете link1.txt channels.txt можете предоставить. Просто без них скрипт не получится протестить. Также можете написать что скрипт должен делать.
 

Форум IT Специалистов