Python Skript geht nicht mehr nach Newline Aenderung



  • Hi,

    ich habe unter Linux ein Python Skript geschrieben, das ich mit $./myScript.py ausfuehren kann.
    Jetzt habe ich den Zeilenumbruch im Editor Kate von Linux auf Windows geaendert (damit das Skript auch auf Windows editierbar ist), jedoch startet jetzt das Skript nicht mehr per $./myScript.py. Per $python myScript.py geht es nach wie vor.
    Die ersten zwei Zeilen meines Skripts lauten:

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

    Wieso geht es mit Windows Newlines nicht mehr? Was kann ich machen, damit es Auf Win und Linux lesbar ist (korrekte Zeilenumbrueche im Editor) und auf beiden Systemen ausfuehrbar ist?



  • Mal abgesehen davon, dass jeder vernünftige Texteditor auch unter Windows mit "\n" statt "\r\n" klarkommen sollte (Warum das dusselige Notepad das immsernoch nicht kann, ist mir ein Rätsel.), dürfte das trotzdem keine Probleme geben. Lad dein Script (bzw. eine Miniversion mit dem gleichen Problem) doch mal hoch und poste den Link, aber halt nicht codepad, pastebin oder sowas. 😉



  • Bleib bei Linux line endings (\n statt \r\n).

    Python selber kommt mit allen Arten von line endings klar, aber deine bash nicht.
    In der 1. Zeile steht ja
    #!/path/to/python\r\n

    und das \r haut deine bash nun auf, da er das shebang bis zum \n liest. und python\r ist halt kein gültiger interpreter.



  • Ah! 👍



  • Shade Of Mine schrieb:

    Bleib bei Linux line endings (\n statt \r\n).

    Python selber kommt mit allen Arten von line endings klar, aber deine bash nicht.
    In der 1. Zeile steht ja
    #!/path/to/python\r\n

    und das \r haut deine bash nun auf, da er das shebang bis zum \n liest. und python\r ist halt kein gültiger interpreter.

    Du meinst den Linux-Kernel. Aber der Rest passt 👍



  • @Tippgeber
    Wird der shebang vom Kernel gelesen und interpretiert?



  • hustbaer schrieb:

    @Tippgeber
    Wird der shebang vom Kernel gelesen und interpretiert?

    Ja, sonst könntest du ein solches Programm nicht aus einem anderen Programm z.B. über exec() ausführen. (Sondern nur über system() was auf POSIX Systemen den String an die Shell übergibt.)

    Wie die Shebang interpretiert wird ist aber vom System abhängig, falls man mehr als ein Argument übergibt. Linux verpackt alles was nach dem Pfad/Programm kommt in ein Argument, also die folgende Shebang: #!/bin/sh -x -v ist unter Linux äquivalent zu folgendem Aufruf auf der Shell: $ /bin/sh '-x -v'. Iirc wird es unter HP UX wie folgender Aufruf auf der Shell interpretiert: $ /bin/sh '-x' '-v'. (Könnte aber auch sehr gut ein anderes Unix gewesen sein. Ich hatte mal ein Bookmark auf eine tolle Seite die das aufgelistet hat.)



  • Interessant, danke.
    BTW: ich nehme an man kann shebangs verketten?
    Wie werden dann die Argumente verkettet?



  • hustbaer schrieb:

    Interessant, danke.
    BTW: ich nehme an man kann shebangs verketten?
    Wie werden dann die Argumente verkettet?

    Du meinst sowas wie:

    #!/bin/sh -x
    echo "Skript A: $@"
    /bin/sh "$@"
    
    #!SkriptA -v
    echo "Skript B"
    
    $ ./SkriptB
    

    ?

    Beim Starten von SkriptB führt der Kernel exec("SkriptA", "-v", "./SkriptB"); aus (sinngemäß). Da SkriptA ein Skript ist führt dieses exec dann exec("/bin/sh", "-x", "SkriptA", "-v", "./SkriptB"); aus.

    Ich bin mir aber recht sicher, dass das nicht im POSIX Standard abgedeckt ist.



  • Dieser Thread wurde von Moderator/in rüdiger aus dem Forum Rund um die Programmierung in das Forum Dynamische Programmiersprachen (Python, Ruby, Perl, Lua & Co) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten