Problem mit Python Argumente

  • Ich habe aktuell das Problem das ich ein Python Skript aus einem Lua Skript aufrufen möchte. Das funktioniert auch ganz gut solang ich das & weglasse, das das skript im hintergrund laufen lassen soll.

    Code
    os.execute("sudo python /home/pi/scripts/test.py& arg1 arg2 arg3")


    Sobald ich das und Zeichen setzte, wird zwar das Skript im Hintergrund ausgeführt, allerdings die Parameter nicht erkannt und ein Fehler angezeigt:

    Code
    sh: 1: arg1 not found

    trozdem läuft das Skript durch, aber wie gesagt leider ohne die Argumente übernommen zu haben.

    Weiß jemand von euch wie ich Argumente übergeben und das Skript trozdem im Hintergrund starten lassen kann?

    Mfg

  • Gut zu wissen :D

    Besten dank!

    Neues Problem.

    Einer der Argumente die übergeben werden ist ein String in dem auch Leerzeichen und/oder Text in <> Klammern vorkommen.

    letzteres scheint Python garnicht zu gefallen. Gibt es ne möglichkeit Python mitzuteilen das das ein großer String ist?

    Mfg

    Einmal editiert, zuletzt von Mooo (16. Februar 2014 um 00:26)

  • Es dreht sich hier um ein Problem der Parameterübergabe zwischen Python und bash und dann wieder zu Python. Anbei ein kleines Beispiel, welches das Problem verdeutlichet:


    liefert

  • framp: Da interpretiert du jetzt zu viel rein - Guck dir mal bitte genau die Code Zeile im 1. Beitrag an, da werden nirgends zu viele " oder ' genutzt, also treffen 95% deiner Beispiele gar nicht hierauf zu!

    Der TE führ es so aus:

    Code
    os.execute("sudo python /home/pi/scripts/test.py& arg1 arg2 arg3")

    Er führt also ein anderes Python Script aus ..mal davon abgesehen das execute keine gültige Anweisung ist..

    Stellt man das nach und erstellt 2 Python Scripts:

    erstes.py

    Python
    #!/usr/bin/python
    import os
    import stat
    
    
    os.system("python anderes.py& arg1 arg2 arg3")

    anderes.py

    Python
    #!/usr/bin/python
    print 'frampig'

    ..Führt man jetzt erstes.py aus kriegt man die Fehlermeldung vom TE:

    Code
    root@raspberrypi:/tmp# python erstes.py 
    sh: 1: arg1: not found
    root@raspberrypi:/tmp# frampig


    Ändert man jetzt erstes.py und nimmt das " & " raus:

    Python
    #!/usr/bin/python
    import os
    import stat
    
    
    os.system("python anderes.py arg1 arg2 arg3")

    Und führt erstes.py erneut aus gibt es keine Fehlermeldung mehr (ich weiß, in meinem Beispiel werden arg1 bis arg3 nicht beachtet aber das is hierfür unwichtig):

    Code
    root@raspberrypi:/tmp# python erstes.py 
    frampig
    root@raspberrypi:/tmp#

  • framp: Da interpretiert du jetzt zu viel rein - Guck dir mal bitte genau die Code Zeile im 1. Beitrag an, da werden nirgends zu viele " oder ' genutzt, also treffen 95% deiner Beispiele gar nicht hierauf zu!


    Du hast ja oben die Lösung fuer den konkreten Fall gegeben. Meine Absicht mit dem Code ist von dem konkreten Problem zu abstrahieren und noch weitere verschiedene Aufrufvarianten und dessen Verhalten deutlich zu machen. Die Bash, die ja zwischen den Aufrufen mit reinkommt, ist da schon etwas zickig. Mit os.subprocess gibt es ja auch noch weitere Aufrufvarianten, die jetzt zu hier diskutieren den Rahmen sprengen wuerden.

    Zitat


    Er führt also ein anderes Python Script aus...


    Um das Verhalten der bash mit den Parametern zu erklären reicht schon das kleine bash Script. Aber der Vollstaendigkeit halber habe ich auch ein aequivalentes Pythonscript zugefuegt. Das Ergebnis sieht wie erwartet identisch aus.

    Zitat


    ..mal davon abgesehen das execute keine gültige Anweisung ist..


    Sieh Dir bitte mal genau den ersten Beitrag vom TE an. Der TE hat dort geschrieben

    Zitat von Mooo


    Ich habe aktuell das Problem das ich ein Python Skript aus einem Lua Skript aufrufen möchte.


    Dort gibt es os.execute.

    Anbei das Beispielprog mit einem Pythonprogramm welches aufgerufen wird.

    Spoiler anzeigen

    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    import os

    pythonProgramName="./myPython.sh"
    pythonProgram="""#!/usr/bin/python

    import sys

    count=1
    for arg in sys.argv[1:]:
    print "Argument %d: %s" % (count, arg)
    count+=1
    """

    # Erstelle kleines bash Script welches seine Parameter meldet

    bashFile = open(pythonProgramName,'w')
    bashFile.write(pythonProgram)
    bashFile.close()
    os.system('chmod +x ' + pythonProgramName)

    # Verschiedene Parameterübergaben

    print 'Params: eins zwei'
    os.system(pythonProgramName + ' eins zwei')
    print '\nParams: "eins zwei"'
    os.system(pythonProgramName + ' "eins zwei"' )
    print '\nParams: eins zwei drei'
    os.system(pythonProgramName + ' eins zwei drei' )
    print '\nParams: "eins zwei" drei'
    os.system(pythonProgramName + ' "eins zwei" drei' )
    print '\nParams: "eins zwei drei"'
    os.system(pythonProgramName + ' "eins zwei drei"' )

    print '\nParams: "<eins zwei>" drei'
    os.system(pythonProgramName + ' "<eins zwei>" drei' )
    print '\nParams: <eins zwei> drei'
    os.system(pythonProgramName + ' <eins zwei> drei' )

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!