Python获取传递的参数

3

我正在处理一个项目,该项目允许用户通过添加必要的参数设置上传文件的路径,但由于某些原因,upload_destination变量总是为空!下面是我的代码:

def main():
  global listen
  global port
  global execute
  global command
  global upload_destination
  global target

  if not len(sys.argv[1:]):
     usage()
  try:
     opts, args = getopt.getopt(sys.argv[1:], "hle:t:p:cu", ["help", "listen", "execute", "target", "port", "command", "upload"])
  except getopt.GetoptError as err:
     print str(err)
     usage()

  for o,a in opts:
     if o in ("-h", "--help"):
         usage()
     elif o in ("-l", "--listen"):
         listen = True
     elif o in ("-e", "--execute"):
         execute = True
     elif o in ("-c", "--commandshell"):
         command = True
     elif o in ("-u", "--upload"):
         #Here's the problem, a is empty even though I include a path
         upload_destination = a
     elif o in ("-t", "--target"):
         target = a
     elif o in ("-p", "--port"):
         port = int(a)
     else:
         assert False, "Unhandled Option"

  if not listen and len(target) and port > 0:
     buffer = sys.stdin.read()
     client_sender(buffer)

  if listen:
     server_loop()

我通过输入以下内容来调用程序:

C:\Users\Asus\Desktop\PythonTest>python test.py -l -c -p 3500 -u C:\Users\Asus\Desktop\Test

2
为什么不使用argparse(https://docs.python.org/3/library/argparse.html)? - linusg
可能与此无关,但请尝试使用正斜杠。例如,如果您有s =“something/new”,则最终会变成s =“something(换行符)ew” - Peter
@Peter 我也考虑过这个问题,所以我尝试了简单地输入“Test”,但结果仍然为空。 - Aginu
你确定 elif 代码块被执行了吗?如果在 upload_destination = a 前一行加上 print("about to change upload destination"),它会被打印出来吗? - Kevin
@Kevin 是的,它可以,我试过多次。 - Aginu
愚蠢的问题,请原谅我问,你是否在某个地方调用了 main() 函数? - cdarke
1个回答

7
这是一个简单的漏掉了冒号:https://docs.python.org/2/library/getopt.html

options是脚本想要识别的选项字母串,需要参数的选项后面加上冒号(':'),也就是与Unix getopt()使用相同的格式。

"hle:t:p:cu"改为"hle:t:p:cu:",然后它应该工作了(至少在我用Win7/Python3.5的时候有效)。
当您使用代码执行print(opts, args)时,会得到:
([('-l', ''), ('-c', ''), ('-p', '3500'), ('-u', '')], ['C:UsersAsusDesktopTest'])

加上冒号后它变成了:
([('-l', ''), ('-c', ''), ('-p', '3500'), ('-u', 'C:UsersAsusDesktopTest')], [])

没有冒号,C:\Users\... 就成为了一个新的参数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接