2012-04-06 12 views
3

Ich experimentiere mit Datei-I/O. Ich habe ein kleines Übungsprogramm, das beim Ausführen eine Textdatei erstellt. Ich packte es mit pyinstaller, so dass Doppelklick auf die exe einen neuen Ordner erstellt und eine Textdatei mit "Hallo Welt" darin platziert. Kinderleicht.Ist es möglich, Argumente an eine Python-exe zur Laufzeit übergeben?

Dann begann ich mich über main() zu fragen. Das ist nur eine Funktion wie jede andere, oder? Bedeutet das, dass ich Argumente zur Laufzeit übergeben kann?

Ich habe über den Steam-Client nachgedacht und wie man Sachen wie '-dev' und '-console' in die Verknüpfung einfügen kann. Gibt es eine Möglichkeit, dies zu einer Python-Exe zu machen, die ich gemacht habe?

ich schrecklich erläutern kann, also hier ein Beispiel:

def makeFile(string): 
    if string: 
     f = open('mytext.txt', 'w') #create text file in local dir 
     print >> f, 'hello, ' + string + '! \nHow are ya?' 
     f.close() 
    else: 
     f = open('mytext.txt', 'w') #create text file in local dir 
     print >> f, 'hello, person! \nHow are ya?' 
     f.close() 

def main(string = None): 
    makeFile(string)  

Also, wenn ich diesen Code nehmen und es eine exe machen, würde ich irgendwie meine optionalen Argumente hinzufügen kann.

Ich habe versucht, den obigen Code, und die laufenden test.exe --"myname", aber das hat nicht funktioniert.

Gibt es eine Möglichkeit, dies zu tun?

Antwort

3

Ja, Sie können es mit sys.argv tun. Überprüfen Sie diesen Link: http://docs.python.org/library/sys.html#sys.argv. Aber vergessen Sie nicht, import sys zu vergessen, und dann können Sie es verwenden. import sys

# If there is an argument passed to your file 
if len(sys.argv) > 1: 
    # argv[1] has your filename 
    filename = sys.argv[1] 
    print (filename) 

# Output... 
# new-host:~ yanwchan$ python3.2 test.py text.txt 
# text.txt 

argv[0] hat test.py

argv[1] hat text.txt

Edit: Allerdings habe ich etwas mehr Forschung zu diesem Thema und fand heraus, dies: https://stackoverflow.com/a/4188500/1276534

Als katrielalex weist darauf hin, vielleicht können Sie in argparse als suchen Gut.? Es bietet viel mehr Funktionalität und Sicherheitscheck. Interessante Information.

Und hier ist ein großes Tutorial: http://www.doughellmann.com/PyMOTW/argparse/

+0

Das hat perfekt funktioniert! Vielen Dank!! – Zack

+0

Update auf die Antwort, tun 'if len (sys.argv)> 1 'zu testen, ob es Dateinamen Argument gibt, und es wird vorgeschlagen, dass' argparse 'ist besser (um irgendwelche Probleme zu fangen). – George

2

Was Sie suchen ist so etwas wie die Python argparse module

Oder Sie die Werte direkt sys.argv

import sys 
sys.argv[0] # the name of the command that was called 
sys.argv[1] # the first argument, eg '--dev' 
sys.argv[2] # the second... 
3

mit lesen können, was Sie‘ re sucht entweder das sys-Modul oder das optparse-Modul.

sys wird Ihnen sehr grundlegende Kontrolle über Befehlszeilenargumente geben.

Zum Beispiel:

import sys 

if __name__ == "__main__": 
    if len(sys.argv)>1: 
     print sys.argv[1] 

In dem obigen Beispiel, wenn Sie einen Shell und Typen zu öffnen sind -

test.exe "myname" 

Die resultierende Ausgabe wäre:

myname 

Beachten Sie, dass sys.argv [0] der Name des Skripts ist, das Sie gerade ausführen. Jedes nachfolgendes Argument wird durch einen Raum definiert, so in Ihrem Beispiel oben

test.exe -- myname 

argv[0] = "test.exe" 
argv[1] = "--" 
argv[2] = "myname" 

optparse gibt eine viel robustere Lösung, die Sie Befehlszeilenoptionen mit mehreren Optionen definieren kann und definiert Variablen, die die entsprechenden Optionen gespeichert werden, die können zur Laufzeit aufgerufen werden.

Re-Schreiben Ihr Beispiel:

from optparse import OptionParser 

def makeFile(options = None): 
    if options: 
     f = open('mytext.txt', 'w') #create text file in local dir 
     print >> f, 'hello, ' + options.name + '! \nHow are ya?' 
     f.close() 
    else: 
     f = open('mytext.txt', 'w') #create text file in local dir 
     print >> f, 'hello, person! \nHow are ya?' 
     f.close() 



if __name__ == "__main__": 
    parser = OptionParser() 
    parser.add_option('-n','--name',dest = 'name', 
         help='username to be printed out') 
    (options,args) = parser.parse_args() 
    makeFile(options) 

Sie Ihr Programm laufen würde mit:

test.exe -n myname 

und dem Ausgang (in myfile.txt) wäre die erwartete:

Hello, myname! 
How are ya? 

Hoffe, dass hilft!

+0

Oh, das ist ziemlich ordentlich! Vielen Dank! – Zack

+0

+1 auf die fantastischen Beispiele – George

0

Nur ein Hinweis für die Vollständigkeit: Es gibt jetzt docopt, was es wirklich einfach macht, auch komplexe Befehlszeilenschnittstellen zu schreiben, indem man es in einer einfachen Sprache beschreibt. Das Dokumentieren und Analysieren der Schnittstelle wird mit doopt zur gleichen Aufgabe.

Verwandte Themen