Python:如何将需要参数的 sysargv 参数传递给 Python 模块
Python: How to pass sysargv parameters that require an argument to a Python module
我有一个名为 test.py 的 python 测试文件,它只调用另一个 python 文件的 (flvrec.py) 主模块。
我通常会在命令行上将 flvrec.py 调用为 "python flvrec.py -o output.flv 127.0.0.1:1",执行命令的输出将是 output.flv.
Test.py 包含调用 flvrec.py 的以下代码:
2 导入 flvrec
3 打印 "This is where test.py works"
4个
5 flvrec.main (['-o output.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))
而不是
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'
我有一个名为 test.py 的 python 测试文件,它只调用另一个 python 文件的 (flvrec.py) 主模块。 我通常会在命令行上将 flvrec.py 调用为 "python flvrec.py -o output.flv 127.0.0.1:1",执行命令的输出将是 output.flv.
Test.py 包含调用 flvrec.py 的以下代码:
2 导入 flvrec 3 打印 "This is where test.py works" 4个 5 flvrec.main (['-o output.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))
而不是
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'