Skip to main content
 首页 » 编程设计

python之无法使用jython编译python程序

2025年05月04日10zfyouxi

我正在尝试使用 jython 编译一个 python 程序,但它抛出了以下错误

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 

下面是我的python程序。请让我知道如何解决这个问题。


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() 

请您参考如下方法:

就语法而言,Jython 2.2.1(据我所知)等同于 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()