2011-01-07 13 views
1

Starten Sie einfach zu lernen, Python und herumspielen mit Kommandozeilenoptionen an ein Python-Skript übergeben. Ich versuche, zwei oder mehr Argumente verketten und es zu einem String-Variablen weitergeben,argparse verketten CLI Optionen

zB

myscript.py http://www.domain.com 1234 

steckte es in einem String-Variable url, genannt, die dann den Wert haben sollten " http://www.domain.com:1234 "

Ich bin mir nicht sicher, wie man das archiviert. Es ist ziemlich einfach, es mit raw_input und einigen String-Manipulation zu tun, aber ich frage mich, ob dies auch mit argparse getan werden kann.

+0

Was haben Sie versucht? Es scheint, als wäre argparse in diesem Fall nicht besonders nützlich. – Falmarri

Antwort

6
import argparse 

parser = argparse.ArgumentParser() 
parser.add_argument('server') # first positional argument 
parser.add_argument('port') # second positional argument 
args = parser.parse_args() 

url = '%s:%s' % (args.server, args.port) 
print url 
2

argparse ist eine Möglichkeit, es zu lösen, aber kann übertrieben sein, wenn Sie nur lernen (YMMV).

Wenn Sie das sys Modul importieren, werden die Befehlszeilenargumente an Sie weitergegeben werden in einer Liste von Strings verfügbar bei sys.argv

import sys 
if len(sys.argv) < 3: 
    print "Not enough args!" 
    sys.exit(0) 
# sys.argv[0] is the name of your script, the rest are parameters 
url = "%s:%s" % (sys.argv[1], sys.argv[2]) 
print url 
+0

Lustig, wie das argparse Beispiel in der Tat fast so kurz ist;) – delnan

+0

@delnan - ja, das untergräbt meine "warum mit Argarse kümmern?" Argument ... – bgporter

+1

argparse scheint jedoch ziemlich mächtig zu sein, aber die Beispiele auf http://docs.python.org/dev/library/argparse.html zu betrachten war ein wenig überwältigend, besonders wenn man einfach mit der Sprache anfängt . – user567538

0

Wenn Sie eine Variable mit der Zeichenfolge wollen http://www.domain.com:1234 von Eingabebefehlszeile dann das tun folgende:

if len(sys.argv) >= 3: 
    result = '%s:%s' % tuple(sys.argv[1:3]) 
0

Warum nicht tun,

argstring = ':'.join(args[1:]) 
0

Dank Bernstein,

, die genau das, was ich suchte

#!/usr/bin/python 

from urllib import urlopen 
import argparse 

usage='will be using it later' 

parser=argparse.ArgumentParser(formatter_class=argparse.RawDescriptionHelpFormatter, description=usage, add_help=False) 
parser.add_argument('link') 
parser.add_argument('port') 
args = parser.parse_args() 

url = '%s:%s' % (args.link, args.port) 
link = urlopen(url) 
content=link.read() 

print(content) 

nur ein bisschen verwirrt mit dieser Zeile „url = '% s:% s' % (args.link, args.port) " nimmt diese Zeile die Argumente in Klammern und fügt sie der String-Variablen 'url' hinzu?

Jack

+0

http://docs.python.org/library/stdtypes.html#String-Formatierung – jfs

0

nur ein bisschen verwirrt mit dieser Linie "url = '% s:% s' % (args.link, args.port)" hat diese Linie nehmen die Argumente in Klammern und fügen Sie es zu die String-Variable 'URL'?

Dieses Format wird eigentlich nicht mehr empfohlen. (siehe http://docs.python.org/tutorial/inputoutput.html). Der einfachste Weg, um das gleiche mit einer zur Zeit empfohlene Methode zu tun wäre: -

url = '{0}:{1}'.format(args.link , args.port) 

wo {n} ist die n-te Variable innerhalb Format (Variablen). Diese Methode konvertiert die Argumente immer in eine Zeichenfolge für Sie.

Die ältere Methode, die% s verwendet, macht dasselbe; Die Bedeutung 's' wandelt ein Argument in eine Zeichenfolge um, aber es müssen genau so viele '% s'-Flags in der Zeichenfolge vorhanden sein wie Argumente nach dem% -Zeichen nach der Zeichenfolge. Mach dir keine Sorgen, aber wenn du lernst, benutze .format().