2010-09-17 2 views
2

Я пытаюсь скомпилировать программу питона с помощью Jython и бросает под ошибкойне удалось скомпилировать программу питона с помощью Jython

C:\jython2.2.1>jython test.py 
Traceback (innermost last): 
    (no code object) at line 0 
    File "test.py", line 30 
        html = html if html else download(url, user_agent).read() 
           ^
SyntaxError: invalid syntax 

Ниже мой питон программа. Пожалуйста, дайте мне знать, как это решить.


import sys 
import re 
import urllib2 
import urlparse 
from optparse import OptionParser 


# regular expression data for each website 
VIDEO_DATA = [ 
    ('youtube.com', '%7C(.*?videoplayback.*?)%2C'), 
    ('metacafe.com', '&mediaURL=(.*?)&'), 
] 
# default user agent to use when downloading 
USER_AGENT = 'pytube' 
# size of file to download 
CHUNK_SIZE = 1024 * 1024 



def scrape(url, html=None, user_agent=None, output=None): 
    """Scrape video location from given url. 

    Use html instead of downloading if passed. 
    Download file to output if passed. 
    Return url of video if found, else None 
    """ 
    netloc = urlparse.urlsplit(url).netloc 
    for domain, video_re in VIDEO_DATA: 
     if domain in netloc: 
      html = html if html else download(url, user_agent).read() 
      search = re.search(video_re, html) 
      if search: 
       flash_url = urllib2.unquote(search.group(1)) 
       if output: 
        print "Downloading flash to `%s'" % output, 
        #open(output, 'wb').write(download(flash_url, user_agent).read()) 
        req = download(flash_url, user_agent) 
       # testing with keyword in python 
        with open(output, 'wb') as fp: 
         chunk = True 
         while chunk: 
          chunk = req.read(CHUNK_SIZE) 
          if chunk: 
           fp.write(chunk) 
           #fp.flush() 
           print '.', 
           sys.stdout.flush() 
        print 
       return flash_url 
      else: 
       raise PyTubeException('Failed to locate video regular expression in downloaded HTML') 
    raise PyTubeException('URL did not match available domains') 


def download(url, user_agent=None): 
    """Download url and return data 
    """ 
    headers = {'User-Agent' : user_agent} 
    req = urllib2.Request(url, None, headers) 
    return urllib2.urlopen(req) 


class PyTubeException(Exception): 
    pass 



if __name__ == '__main__': 
    # parse command line options 
    parser = OptionParser(usage='usage: %prog, [-o <file.flv> -a <user_agent> -s -h] url') 
    parser.add_option('-o', '--output', dest='output', help='Output file to download flash file to. If this is not specified file will not be downloaded.') 
    parser.add_option('-s', '--sites', action='store_true', default=False, dest='sites', help='Display sites that pytube supports, then quit.') 
    parser.add_option('-a', '--agent', dest='user_agent', default=USER_AGENT, help='Set user-agent for downloads.') 
    options, args = parser.parse_args() 
    if options.sites: 
     print '\n'.join(domain for (domain, reg) in VIDEO_DATA) 
    else: 
     if args: 
      flash_url = scrape(args[0], user_agent=options.user_agent, output=options.output) 
      if flash_url: 
       print flash_url 
     else: 
      print 'Need to pass the url of the video you want to download' 
      parser.print_help() 

+0

после изменения кода, как вы сказали, то он показывает ниже ошибки C: \ jython2.2.1> Jython test.py Traceback (сокровенная последний): (без объекта кода) в строке 0 Файл «test.py», строка 30 html = (html)? "HTML": скачать (URL, user_agent) .read() ^ SyntaxError: несовместимая dedent – JavaGeek

ответ

1

Jython 2.2.1 (AFAIK) эквивалентна CPython 2.2.1, насколько синтаксис обеспокоен. В строке, которая вызывает проблему, используется тернарный оператор, который был введен позже. решение состоит в том, чтобы заменить его выражением if.

if not html: 
    html = download(url, user_agent).read() 

Это должно позаботиться об ошибке синтаксиса. Существует также пункт with, который вам нужно будет заменить.

with open(output, 'wb') as fp: 
    chunk = True 
    while chunk: 
     chunk = req.read(CHUNK_SIZE) 
     if chunk: 
      fp.write(chunk) 
      #fp.flush() 
      print '.', 
      sys.stdout.flush() 

Вы можете заменить это

try: 
    fp = open(output, 'w') 
    chunk = True 
    while chunk: 
     chunk = req.read(CHUNK_SIZE) 
      if chunk: 
       fp.write(chunk) 
       #fp.flush() 
       print '.', 
       sys.stdout.flush() 
finally: 
    fp.close() 
+0

Теперь он бросает ошибку, как^ SyntaxError: непоследовательный dedent C: \ jython2.2.1> Jython test.py Traceback (внутренний последнее): (кодовый номер объекта) в строке 0 файла "test.py", строка 30 если не HTML: HTML = скачать (URL, user_agent) .read() ^ SyntaxError: несовместимая dedent – JavaGeek

+0

Sukumar: в Python, отступы важны. Вы не отступаете что-то правильно. – geoffspear

+0

На самом деле я новичок в python и все еще пытаюсь понять, что с этим не так. Не удалась. Да, такая же ошибка – JavaGeek

Смежные вопросы