2016-06-16 2 views
0

Ich habe eine Python-Testdatei namens test.py, die nur eine andere Python-Datei (flvrec.py) Hauptmodul aufruft. Normalerweise würde ich flvrec.py in der Befehlszeile als "python flvrec.py -o output.flv 127.0.0.1:1" aufrufen und die Ausgabe des Befehls wäre output.flv.Python: Wie sysargv Parameter übergeben werden, die ein Argument zu einem Python-Modul benötigen

Test.py enthält folgenden Code aufzurufen flvrec.py:

2 import flvrec 3 print "Hier arbeitet test.py" 5 flvrec.main ([ '-o-Ausgang. flv '' 127.0.0.1:1 '])

Die Ausgabe dieses Codes ist eine generische Datei, aber ich möchte immer noch in der Lage sein, die Datei so zu benennen, wie ich will. Ich habe eine eingefügte Version von flvrec.py unten zur Verfügung gestellt und ich sehe, wo der Dateiname zugewiesen wird, gibt es eine Weise, die ich meinen Dateinamen mit den Sysarg-Parametern spezifizieren kann, wie ich in der Befehlszeile tun konnte?

#!/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)) 

Antwort

1

Statt

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

Klingt wie Sie

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

tun müssen, glaube ich, was Sie fehlte, war die .split(), und Sie wurden in einem einzigen String Argument übergeben . Beachten Sie außerdem, dass sys.argv das erste Argument für den Programmnamen festgelegt hat, wenn es über die Befehlszeile aufgerufen wird. flvrec erwartet, nicht den Index 0 des Arrays zu verwenden, also setze ich es auf "Junk"

+0

Danke für die Erklärung. Das hat mein Problem gelöst. Ich hatte gesehen, wo das erste Argument ignoriert würde, und ich habe es immer noch nicht berücksichtigt. Vielen Dank! – Axel

Verwandte Themen