2016-06-16 10 views
0

私はtest.pyという名前のpythonテストファイルを持っています。このファイルは別のpythonファイルの(flvrec.py)メインモジュールを呼び出すだけです。 私は通常、 "python flvrec.py -o output.flv 127.0.0.1:1"とコマンドラインでflvrec.pyを呼び出し、コマンドを実行するとoutput.flvを出力します。Python:Pythonモジュールに引数を必要とするsysargvパラメータを渡す方法

Test.pyはflvrec.py呼び出すために、次のコードが含まれています 4 5 flvrec.main([ '-o出力を

2インポートflvrec 3プリント "test.pyが働く場所です"。 flv "127.0.0.1:1 '])

このコードの出力は一般的なファイルですが、希望するとおりにファイル名を付けたいと思います。私は以下のflvrec.pyの貼り付けバージョンを提供しました。ファイル名がどこに割り当てられているかを見ていますが、コマンドラインで実行できたようにsysargパラメータでファイル名を指定する方法はありますか?

#!/usr/bin/env python 
## 
## flvrec.py - VNC to FLV recording tool. 
## 
## Copyright (c) 2009-2010 by Yusuke Shinyama 
## 

import sys, time, socket, os, os.path, subprocess, signal 
from vnc2flv.flv import FLVWriter 
from vnc2flv.rfb import RFBNetworkClient, RFBError, PWDFile, PWDCache 
from vnc2flv.video import FLVVideoSink, str2clip, str2size 


## flvrec 
## 
def flvrec(filename, host='localhost', port=5900, 
      framerate=12, keyframe=120, 
      preferred_encoding=(0,), pwdfile=None, 
      blocksize=32, clipping=None, 
      cmdline=None, 
      debug=0, verbose=1): 
    fp = file(filename, 'wb') 
    if pwdfile: 
     pwdcache = PWDFile(pwdfile) 
    else: 
     pwdcache = PWDCache('%s:%d' % (host,port)) 
    writer = FLVWriter(fp, framerate=framerate, debug=debug) 
    sink = FLVVideoSink(writer, 
         blocksize=blocksize, framerate=framerate, keyframe=keyframe, 
         clipping=clipping, debug=debug) 
    client = RFBNetworkClient(host, port, sink, timeout=500/framerate, 
           pwdcache=pwdcache, preferred_encoding=preferred_encoding, 
           debug=debug) 
    if verbose: 
     print >>sys.stderr, 'start recording' 
    pid = 0 
    if cmdline: 
     pid = os.fork() 
     if pid == 0: 
      os.setpgrp() 
      os.execvp('sh', ['sh', '-c', cmdline]) 
      sys.exit(1) 
    retval = 0 
    try: 
     def sigint_handler(sig, frame): 
      raise KeyboardInterrupt 
     signal.signal(signal.SIGINT, sigint_handler) 
     client.open() 
     try: 
      while 1: 
       client.idle() 
     finally: 
      client.close() 
    except KeyboardInterrupt: 
     pass 
    except socket.error, e: 
     print >>sys.stderr, 'Socket error:', e 
     retval = 1 
    except RFBError, e: 
     print >>sys.stderr, 'RFB error:', e 
     retval = 1 
    if pid: 
     os.killpg(os.getpgid(pid), signal.SIGTERM) 
    if verbose: 
     print >>sys.stderr, 'stop recording' 
    writer.close() 
    fp.close() 
    return retval 


# main 
def main(argv): 
    import getopt, vnc2flv 
    def usage(): 
     print argv[0], vnc2flv.__version__ 
     print ('usage: %s [-d] [-q] [-o filename] [-r framerate] [-K keyframe]' 
       ' [-e vnc_encoding] [-P vnc_pwdfile] [-N]' 
       ' [-B blocksize] [-C clipping] [-S subprocess]' 
       ' [host[:display] [port]]' % argv[0]) 
     return 100 
    try: 
     (opts, args) = getopt.getopt(argv[1:], 'dqo:r:K:t:e:P:NB:C:S:') 
    except getopt.GetoptError: 
     return usage() 
    debug = 0 
    verbose = 1 
    filename = 'out%s.flv' % time.strftime('%Y%m%d%H%M') 
    framerate = 12 
    keyframe = 120 
    preferred_encoding = (0,) 
    pwdfile = None 
    cursor = True 
    blocksize = 32 
    clipping = None 
    cmdline = None 
    (host, port) = ('localhost', 5900) 
    for (k, v) in opts: 
     if k == '-d': debug += 1 
     elif k == '-q': verbose -= 1 
     elif k == '-o': filename = v 
     elif k == '-r': framerate = int(v) 
     elif k == '-K': keyframe = int(v) 
     elif k == '-e': preferred_encoding = tuple(int(i) for i in v.split(',')) 
     elif k == '-P': pwdfile = v 
     elif k == '-N': cursor = False 
     elif k == '-B': blocksize = int(v) 
     elif k == '-C': clipping = str2clip(v) 
     elif k == '-S': cmdline = v 
    if not cursor: 
     preferred_encoding += (-232,-239,) 
    if 1 <= len(args): 
     if ':' in args[0]: 
      i = args[0].index(':') 
      host = args[0][:i] or 'localhost' 
      port = int(args[0][i+1:])+5900 
     else: 
      host = args[0] 
    if 2 <= len(args): 
     port = int(args[1]) 
    return flvrec(filename, host, port, framerate=framerate, keyframe=keyframe, 
        preferred_encoding=preferred_encoding, pwdfile=pwdfile, 
        blocksize=blocksize, clipping=clipping, cmdline=cmdline, 
        debug=debug, verbose=verbose) 

if __name__ == "__main__": sys.exit(main(sys.argv)) 

答えて

1

代わりの

flvrec.main (['-o output.flv' '127.0.0.1:1']) 

あなたは

flvrec.main (['junk','-o','output.flv', '127.0.0.1:1']) 

を行う必要があるように私はあなたが欠落していたこと(.splitだったと思うね)、あなたは、単一の文字列引数に渡しました。 。また、sys.argvには、コマンドラインから呼び出されたときに最初の引数がプログラム名に設定されています。 flvrecは配列のインデックス0を使用しないことを期待していますので、私は 'junk'に設定します

+0

ありがとうございます。それが私の問題を解決しました。私は最初の議論が無視される場所を見ていましたが、私はまだそれを説明しませんでした。ありがとう! – Axel

関連する問題