it-swarm.com.de

you are the Python script with the function about the befehlszeile under Linux from

Ich habe meine Python-Datei convertImage.py und in der Datei befindet sich ein Skript, das ein Bild nach meinen Wünschen konvertiert. Das gesamte Konvertierungsskript befindet sich in einer Funktion namens convertFile (fileName).

Jetzt besteht mein Problem darin, dass ich dieses Python-Skript über die Linux-Befehlszeile ausführen muss, während ich gleichzeitig die Funktion convertFile (fileName) übergebe.

beispiel:

 linux user$: python convertImage.py convertFile(fileName)

Dies sollte das Python-Skript ausführen, das die entsprechende Funktion übergibt.

beispiel:

def convertFile(fileName):

    import os, sys
    import Image
    import string

    splitName = string.split(fileName, "_")
    endName = splitName[2]
    splitTwo = string.split(endName, ".")
    userFolder = splitTwo[0]

    imageFile = "/var/www/uploads/tmp/"+fileName

    ...rest of the script...

    return

Was ist der richtige Weg, um dieses Python-Skript auszuführen und den Dateinamen von der liunx-Befehlszeile aus richtig an die Funktion zu übergeben?

Vielen Dank im Voraus

10
knittledan

Diese

if __== "__main__":
    command= " ".join( sys.argv[1:] )
    eval( command )

Das wird funktionieren. Aber es ist wahnsinnig gefährlich.

Sie müssen sich wirklich überlegen, wie Ihre Befehlszeilensyntax lautet. Und Sie müssen darüber nachdenken, warum Sie die etablierten Linux-Standards brechen, um Argumente für ein Programm anzugeben.

Sie sollten beispielsweise in Betracht ziehen, die nutzlosen () in Ihrem Beispiel zu entfernen. Mach es stattdessen so.

python convertImage.py convertFile fileName

Dann können Sie - mit wenig Aufwand - argparse verwenden, um den Befehl ("convertFile") und die Argumente ("fileName") abzurufen und innerhalb der Standard-Linux-Befehlszeilensyntax zu arbeiten.

function_map = { 
    'convertFile': convertFile,
    'conv': convertFile,
}
parser = argparse.ArgumentParser()
parser.add_argument( 'command', nargs=1 )
parser.add_argument( 'fileName', nargs='+' )
args= parser.parse_args()
function = function_map[args.command]
function( args.fileName )
22
S.Lott

Schnell und dreckig unterwegs:

linux user$: python convertImage.py convertFile fileName

und dann in convertImage.py

if __== '__main__':
    import sys
    function = getattr(sys.modules[__name__], sys.argv[1])
    filename = sys.argv[2]
    function(filename)

Ein differenzierterer Ansatz würde argparse (für 2.7 oder 3.2+) oder optparse verwenden.

4
Ethan Furman

Erstellen Sie einen ausführbaren Teil Ihres Skripts auf oberster Ebene, der Befehlszeilenargumente analysiert, und übergeben Sie ihn dann wie folgt in einem Aufruf an Ihre Funktion:

import os, sys
#import Image
import string


def convertFile(fileName):
    splitName = string.split(fileName, "_")
    endName = splitName[2]
    splitTwo = string.split(endName, ".")
    userFolder = splitTwo[0]

    imageFile = "/var/www/uploads/tmp/"+fileName

    print imageFile     # (rest of the script)

    return


if __== '__main__':
    filename = sys.argv[1]
    convertFile(filename)

Dann aus einer Shell,

$ convertImage.py the_image_file.png
/var/www/uploads/tmp/the_image_file.png
0
Santa