[Python] вопрос/ответ.

Discussion in 'Python' started by De-visible, 21 Jan 2009.

  1. [Dezzter]

    [Dezzter] Elder - Старейшина

    Joined:
    26 Nov 2007
    Messages:
    182
    Likes Received:
    131
    Reputations:
    3
    Рабочий код:
    PHP:
    import urllib2
    proxy_handler 
    urllib2.ProxyHandler({'http''174.142.104.57:3128'})
    opener urllib2.build_opener(proxy_handler)
    opener.open('http://2ip.ru/')
    Не рабочий:
    PHP:
    import urllib2
    proxy_handler 
    urllib2.ProxyHandler({'http''174.142.104.57:3128'})
    opener urllib2.build_opener(proxy_handler)
    opener.open('http://my_site.ru/test.php')
    Вообще ни чего не понимаю, бред какой-то.. Создал страничку на своём сайте, обычный пхп скрипт, который записывает в тхт IP зашедших людей.. Так вот, первый код работает, всё норм :) Как только заменяю 2ip.ru на свой сайт, то сыпятся ошибки:

    Code:
    Traceback (most recent call last):
      File "C:\Python26\Python Sorce\test.py", line 14, in <module>
        opener.open(http://my_site.ru/test.php').read()
      File "C:\Python26\lib\urllib2.py", line 395, in open
        response = meth(req, response)
      File "C:\Python26\lib\urllib2.py", line 508, in http_response
        'http', request, response, code, msg, hdrs)
      File "C:\Python26\lib\urllib2.py", line 433, in error
        return self._call_chain(*args)
      File "C:\Python26\lib\urllib2.py", line 367, in _call_chain
        result = func(*args)
      File "C:\Python26\lib\urllib2.py", line 516, in http_error_default
        raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
    HTTPError: HTTP Error 403: Forbidden
    Просто не могу понять почему не работает, страница работает, всё норм :(
     
  2. login999

    login999 Elder - Старейшина

    Joined:
    12 Jun 2008
    Messages:
    491
    Likes Received:
    280
    Reputations:
    92
    Жаголовки....
    Тебе доштуп к штранице запрешен
     
  3. Chubakur

    Chubakur Member

    Joined:
    6 Apr 2009
    Messages:
    48
    Likes Received:
    12
    Reputations:
    0
    Для того чтобы научится питону я попытался написать граббер картинок. То есть запускаешь скрипт, он просит ввести url страницы, ты его пишешь. И программа начинает скачивать оттуда все картинки и сохранять их в папку, которая называется именем сайта откуда скачиваешь. После этого я решил в качестве тренировки дополнить это GUI, для этого я заюзал GTK, и сразу же столкнулся с проблемой. Сам интерфейс выглядит просто, сверху окно для ввода URL, ниже кнопка, ниже окно куда выводится лог. После того как я ввожу url и жму на кнопку, форма зависает. И только после того как все картинки закачаются. Форма развисает, и лог в окне написан уже целиком. Насколько я понимаю, проблема в том, что при нажатии на кнопку у меня выполняется функция-обработчик которая все качает, и поэтому GTK неактивно. То-есть функция обработчик вызывает другие функции, и ждет пока они выполнятся. Я решил, что можно тогда из под обработчика функции вызывать не напрямую, а с передачей управления, например call. Однако , похожих команд для питона я не нашел. Каким образом можно решить эту проблему, чтобы интерфейс стал динамическим ? То-есть закачка производилась как бы в фоне. Например, скачалась картинка - добавилась строчка лога. И так до конца программы.

    P.S. Кстати, я тут придумал как решить это извращенным способом. При нажатии на кнопку будет менятся значение булевой переменной, также будет таймер, который каждые n миллисекунд вызывает функцию. Функция эта будет проверять:
    if значение_переменной_true:
    тормозим таймер, и начинаем выполнять все те функции, сбрасываем значение переменной
    else
    return


    Сильно ли это отразится на производительности?
     
    #443 Chubakur, 15 Dec 2009
    Last edited: 15 Dec 2009
  4. whexp

    whexp Member

    Joined:
    30 Nov 2009
    Messages:
    88
    Likes Received:
    29
    Reputations:
    5
    При нажатии на кнопку создаешь и запускаешь поток, в котором и добавляешь элементы. Если не справишься, то днем, когда прийду напишу примерчик.
     
  5. r0ot

    r0ot New Member

    Joined:
    26 Sep 2009
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    Как подключить PyQt4 к Python в Windows ?
     
  6. whexp

    whexp Member

    Joined:
    30 Nov 2009
    Messages:
    88
    Likes Received:
    29
    Reputations:
    5
    r0ot, а в чем проблема? Качаешь с: http://www.riverbankcomputing.com/software/pyqt/download версию для windows и устанавливаешь.
     
  7. r0ot

    r0ot New Member

    Joined:
    26 Sep 2009
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    всё, разобрался, просто надо было всё скидывать именно в питона
     
  8. Chubakur

    Chubakur Member

    Joined:
    6 Apr 2009
    Messages:
    48
    Likes Received:
    12
    Reputations:
    0
    Напиши пожалуйста!
    thread.start_new_thread(test,(link,))
    не работает. функция test не вызывается по какой-то причине.
    PHP:
    import urllib
    import pygtk
    pygtk
    .require('2.0')
    import gtk
    import re
    import random
    import os
    import urlparse
    import time
    import threading
    link
    =""
    pressed=False
    def printG
    (log):
        
    label.set_text(label.get_text()+'\n'+log)
        return
    def run():
        global 
    link
        printG
    ("Please wait")
        
    startHTMLdownload(link)
        
    parsed_string=IOreg()
        
    downloadImages(parsed_string,link)
    def startDownloadG(button,textbox,label):
        global 
    link
        link 
    textbox.get_text()
        if 
    link[0:7]=="http://":
            
    link=link
        
    else:
            
    link="http://"+str(link)
        
    mtimer=threading.Timer(0.1,run)
        
    mtimer.start()
    def startHTMLdownload(link):
        try:
            
    temp_file=file("temp","r")
        
    except:
            
    temp_file=file("temp","w")
        
    temp_file.close()
        
    temp_file=file("temp","w")
        
    printG("Downloading source code")
        
    urllib.urlretrieve(link,"temp")
        
    temp_file.close()
        
    printG("Source code downloaded")
    def HTMLinitializator():
        
    link=raw_input("Enter URL:")
        if 
    link[0:7]=="http://":
            
    startHTMLdownload(link)
        else:
            
    link="http://"+str(link)
            
    startHTMLdownload(link)
        return 
    link
    def regexper
    (source_string,preg_mask):
        
    parsed_string=re.findall(preg_masksource_string)
        return 
    parsed_string
    def IOreg
    ():
        
    ofile=file("save.txt","w")
        
    ifile=file("temp","r")
        
    regexp="src=[\'|\"]([^\"]+[gif|png|jpg|jpeg|bmp|img])[\'|\"]"
        
    source_string=ifile.read()
        
    parsed_string regexper(source_string,regexp)
        for 
    image in parsed_string:
            
    ofile.write(str(image+'\n'))
        
    ofile.close()
        
    ifile.close()
        return 
    parsed_string
    def downloadImages
    (img_array,link):
        
    parsed_url=urlparse.urlparse(link)
        if 
    img_array.__len__():
            
    printG("Creating directory.")
            try:
                
    os.mkdir(parsed_url.netloc)
            
    except:
                
    printG("Directory already exist")
        
    counter=0
        printG
    ("Start download")
        for 
    image in img_array:
            if 
    image[0:4]=="http":
                
    image_file_name=str(parsed_url.netloc)+"/"+str(counter)+str(image[image.__len__()-4:image.__len__()])
                
    save_file=file(image_file_name,"w")
                
    save_file.write("")
                
    printG("Start downloading:"+str(image))
                try:
                    
    urllib.urlretrieve(imageimage_file_name)
                
    except:
                    
    printG("Error")
                    continue
                
    counter=counter+1
                printG
    ("downloaded:"+str(counter)+"/"+str(img_array.__len__()))
            
    elif image[0:2]=="./":
                
    absoluteLink=link+image[1:image.__len__()]
                
    image_file_name=str(parsed_url.netloc)+"/"+str(counter)+str(image[image.__len__()-4:image.__len__()])
                
    save_file=file(image_file_name,"w")
                
    save_file.write("")
                
    printG("Start downloading:"+str(absoluteLink))
                try:    
                    
    urllib.urlretrieve(absoluteLinkimage_file_name)
                
    except:
                    
    printG("Error")
                    continue
                
    counter=counter+1
                printG
    ("downloaded:"+str(counter)+"/"+str(img_array.__len__()))
            
    elif image[0:2]=="..":
                
    printG("Relative path is not support.")
                continue
            
    elif image[0]=="/":
                
    absoluteLink=link+image
                image_file_name
    =str(parsed_url.netloc)+"/"+str(counter)+str(image[image.__len__()-4:image.__len__()])
                
    save_file=file(image_file_name,"w")
                
    save_file.write("")
                
    printG("Start downloading:"+str(absoluteLink))
                try:
                    
    urllib.urlretrieve(absoluteLinkimage_file_name)
                
    except:
                    
    printG("Error")
                    continue
                
    counter=counter+1
                printG
    ("downloaded:"+str(counter)+"/"+str(img_array.__len__()))
            else:
                
    absoluteLink=link+"/"+image
                image_file_name
    =str(parsed_url.netloc)+"/"+str(counter)+str(image[image.__len__()-4:image.__len__()])
                
    save_file=file(image_file_name,"w")
                
    save_file.write("")
                
    printG("Start downloading:"+str(absoluteLink))
                try:
                    
    urllib.urlretrieve(absoluteLinkimage_file_name)
                
    except:
                    
    printG("Error")
                    continue
                
    counter=counter+1
                printG
    ("downloaded:"+str(counter)+"/"+str(img_array.__len__()))
    #main()
    window=gtk.Window()
    vbox=gtk.VBox()
    label=gtk.Label()
    textbox=gtk.Entry()
    btn_main=gtk.Button("Start")
    window.add(vbox)
    vbox.add(textbox)
    vbox.add(btn_main)
    vbox.add(label)
    window.show_all()
    window.connect("delete-event",lambda a,bgtk.main_quit())
    btn_main.connect("clicked",startDownloadG,textbox,label)
    gtk.main()
    Вот код. Тут у меня при нажатии на кновку start стартует таймер, который через 0,1 с выполняет функцию run() - а эта функция уже инициализирует все остальные функции. Но по какой-то причине функция run не запускается при включенной граф.оболочке программы.
    P.S. Прошу прощения за говнокод, просто изначально это была консольная утилита. И чтобы не писать все заново, я просто отредактировал старый код. Есть много лишнего. Да, и не смейтесь над функцией regexper, я вначале её написал, и только потом осознал что за бред я сделал :(
     
    #448 Chubakur, 16 Dec 2009
    Last edited: 16 Dec 2009
  9. whexp

    whexp Member

    Joined:
    30 Nov 2009
    Messages:
    88
    Likes Received:
    29
    Reputations:
    5
    Нашел тебе статью с примерчиком:
    http://h8-self.livejournal.com/6590.html

    ps. честно говоря я в pygtk не понимаю ничего)) просто сталкивался давно с такой проблемой на wxpython. так вот. возможно в твоем коде нужно вызвать метод gtk.gdk.threads_init()?
     
    #449 whexp, 16 Dec 2009
    Last edited: 16 Dec 2009
  10. Chubakur

    Chubakur Member

    Joined:
    6 Apr 2009
    Messages:
    48
    Likes Received:
    12
    Reputations:
    0
    Огромное тебе спасибо! После того как я вызвал этод метод, код заработал как часы, даже без исправлений! Большое тебе спасибо!
     
  11. whexp

    whexp Member

    Joined:
    30 Nov 2009
    Messages:
    88
    Likes Received:
    29
    Reputations:
    5
    не за что, рад помочь :)
     
    1 person likes this.
  12. Omegа

    Omegа Member

    Joined:
    16 Dec 2009
    Messages:
    27
    Likes Received:
    11
    Reputations:
    5
    Подскажите, пожалуйста, где можно почитать про программирование для смартфонов на питоне? В частности интересует Symbian 9.4 TOUCH.

    P.S. нужно узнать про работу с 2d графикой и тачскрином.
     
    #452 Omegа, 17 Dec 2009
    Last edited: 17 Dec 2009
  13. whexp

    whexp Member

    Joined:
    30 Nov 2009
    Messages:
    88
    Likes Received:
    29
    Reputations:
    5
    Omegа, конкретно по pys60 можешь посмотреть здесь:
    http://mobilenin.com/pys60/menu.htm
    http://wiki.forum.nokia.com/index.php/Introduction_to_PyS60
     
  14. login999

    login999 Elder - Старейшина

    Joined:
    12 Jun 2008
    Messages:
    491
    Likes Received:
    280
    Reputations:
    92
    На wxpython есть пару гуев - хз, никогда не инициализировал потоки - сразу и тупо запускал да и все. Задумался о переходе на pyQt. Не нравится лицензией, зато ВОЗМОЖНО избавлюсь от проблем gtk(Arch, Ubuntu). На Арче - вылетало приложение нафиг при любой попытке изменить фрейм, на Ubuntu реже, но слетает с сегфолтом (плюс в консоле по жизни ошибки).
    Вопрос на засыпку - как себя ведёт pyQt ?
     
  15. razb

    razb Active Member

    Joined:
    24 Mar 2009
    Messages:
    658
    Likes Received:
    133
    Reputations:
    18
    Да нормально себя ведет, по крайней мере пока нареканий нету.
    Что именно тебя не устраивает в лицензии? )
     
  16. login999

    login999 Elder - Старейшина

    Joined:
    12 Jun 2008
    Messages:
    491
    Likes Received:
    280
    Reputations:
    92
    Цена в 350 английских фунтов за версию для использования в разработке проприетарного ПО.
     
  17. whexp

    whexp Member

    Joined:
    30 Nov 2009
    Messages:
    88
    Likes Received:
    29
    Reputations:
    5
    login999, дык на wx их и не надо инициализировать - просто создаешь и запускаешь. насчет корявости гтк - не замечал =/
     
  18. whexp

    whexp Member

    Joined:
    30 Nov 2009
    Messages:
    88
    Likes Received:
    29
    Reputations:
    5
    насчет qt - мне не нравится. какие-то QString вместо обычных строк и т.д. в общем кому что ближе.меня сейчас wx вполне устраивает.
     
  19. login999

    login999 Elder - Старейшина

    Joined:
    12 Jun 2008
    Messages:
    491
    Likes Received:
    280
    Reputations:
    92
    Если чессн, то QT мне нравится тем, за что я ненавижу CURL - универсальностью. ИМХО это то, что можно выучить один раз, а потом использовать из разных языков, так как привязки есть под очень многие. Это немаловажный плюс ИМХО. В принципе wxwindows тоже много к чему привязан. Но хз. Я сейчас опять таки засматриваюсь в сторону QT из-за того, что раньше в нём ненавидел - "лишних" классов. Заебусь описывать сколько у меня было гемора для поддержки соксов в приложениях. Думаю достаточно будет сказать, что я этого так и не добился (CURL фтопку, Socksipy-кусок хавна)... QT же решает эту проблему. Мне уже стало наплевать на "Python-way" и использование QT исключительно как гуя и восторжение на тему "Ах как *****то, что у питона очень дохера сторонних модулей." На проверку оказывается что нормально и стабильно работают исключительно крупные фреймворки (либо к ним относящиеся), все остальные "сторонние" это говно, которого поискать еще нужно. Про стандартную библиотеку молчу - она всегда на высоте (хотя и некоторых моментов не хватает, но идеального не бывает)
    Вот как-то так.
    Прост QT это "вещь в себе"
     
    1 person likes this.
  20. whexp

    whexp Member

    Joined:
    30 Nov 2009
    Messages:
    88
    Likes Received:
    29
    Reputations:
    5
    login999, выговорился :) соглашусь насчет либ - найти что-то серьезное очень трудно. такое ощущение, что либы пишут криворукие дядьки) радуют только довольно популярные библитеки (ну стандартная библиотека - это естественно). из постоянных использую, наверное, только wxpython, django, pytils (удобно для сайтов на джанго когда нужно измеянть текст по падежам), может еще chardet (определяет кодировку строки). часто гораздо проще написать свое, чем разбираться с еле рабочим кодом сторонних либ.
     
    1 person likes this.