SyntaxError: invalid syntax

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
helloworld
User
Beiträge: 10
Registriert: Mittwoch 3. April 2019, 09:18

Hallo,

leider bekomme ich eine Fehlermeldung:

File "scripts/train_model.py", line 3
DATASET=${1:"-dna"}
^
SyntaxError: invalid syntax

Folgendes Skript (python 2.7.8)
#!/bin/bash -x

DATASET=${1:"-dna"}
N_ITER=50000
RUN_DIR="saved_models/${DATASET}"
PATH_DATASET_ALL_CSV="data/csvs/${DATASET}.csv"
PATH_DATASET_TRAIN_CSV="data/csvs/${DATASET}/train.csv"
GPU_IDS=${2:-0}
Hat jemand eine IDee? Ich bin Anfaenger und langsam sehr verzweifelt....
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist kein Python. Das ist Shell Skript.
helloworld
User
Beiträge: 10
Registriert: Mittwoch 3. April 2019, 09:18

Danke! Aber laesst sich der Fehler trotzdem erklaren?
Benutzeravatar
sparrow
User
Beiträge: 4537
Registriert: Freitag 17. April 2009, 10:28

Ja. Man kann ein Shellscript nicht mit dem Python-Interpreter ausführen.
helloworld
User
Beiträge: 10
Registriert: Mittwoch 3. April 2019, 09:18

Und wie kann man das aendern? ich hatte das script so gestartet:
sudo chmod u+x ./dateiname/.sh
sudo ./dateiname/sh
ist es dann nicht als Shellscript ausgefuehrt? Ich bin leider sehr am Anfang...
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wieso denn sudo? Das ist kein magisches "mache es alles richtig"-Kommando. Und so wie du es da oben hingeschrieben hast, sind die Namen auch unterschiedlich. Dann muss das natuerlich fehlschlagen.
helloworld
User
Beiträge: 10
Registriert: Mittwoch 3. April 2019, 09:18

auch ohne sudo geht es nicht. Die Namen sind nur unterschiedlich, weil eben vertippt. das oben genannte soll nur das vorgehen verdeutlichen.
Es ist aber prinzipiel so, dass wenn man ein .sh script startet, dass es dann als Shellscript ausgefuehrt wird? Mir ist nicht ganz klar, wie es haette passieren koennen, dass das Shellscript als Python Interpreter haette ausgefuehrt werden koennen.

Kann der Fehler nicht auch woanders liegen oder ist es sehr wahrscheinlich, dass es an Python/ Shell liegt?
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

@helloworld: also der Fehler tritt in der Datei scripts/train_model.py auf, also nicht in dateiname.sh wie meinst.
Das gezeigte Shell-Skript sieht auch nicht vollständig aus, denn das macht außer ein paar Variablen anlegen, nichts.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Der Fehler den du gepostet hast, der liegt daran das Python eben nicht Shell ist, und du ein Shell-Skript nicht mit Python ausgefuehrt bekommst.

Zu halbeherzig aus dem Gedaechtnis getippten Dingen ohne Fehlermeldung kann man nichts sagen. Da musst du dann schon konkrete Ausgaben und Fehlermeldungen zeigen, die aufgetreten sind, als du das OHNE Python ausgefuehrt hast.

Und zu guter Letzt zum sudo: das einfach so rumzusprenkeln weil man denkt es wuerde irgendwie helfen, kann drastische Folgen haben. Wie zb eine geloeschte Festplatte oder ein sonstwie zerstoertes System.
helloworld
User
Beiträge: 10
Registriert: Mittwoch 3. April 2019, 09:18

Vielen Dank!

Das hier ist das vollstaendige Skript:

#!/bin/bash -x



DATASET=${1:-dna}

N_ITER=50000

RUN_DIR="saved_models/${DATASET}"

PATH_DATASET_ALL_CSV="data/csvs/${DATASET}.csv"

PATH_DATASET_TRAIN_CSV="data/csvs/${DATASET}/train.csv"

GPU_IDS=${2:-0}



DATASET_KWARGS="{\

\"transform_signal\": [\"fnet.transforms.Normalize()\", \"fnet.transforms.Resizer((1, 0.37241, 0.37241))\"], \

\"transform_target\": [\"fnet.transforms.Normalize()\", \"fnet.transforms.Resizer((1, 0.37241, 0.37241))\"] \

}"

BPDS_KWARGS="{\

\"buffer_size\": 1 \

}"



cd $(cd "$(dirname ${BASH_SOURCE})" && pwd)/..



python scripts/python/split_dataset.py ${PATH_DATASET_ALL_CSV} "data/csvs" --train_size 0.75 -v

python train_model.py \

--n_iter ${N_ITER} \

--path_dataset_csv ${PATH_DATASET_TRAIN_CSV} \

--dataset_kwargs "${DATASET_KWARGS}" \

--bpds_kwargs "${BPDS_KWARGS}" \

--path_run_dir ${RUN_DIR} \

--gpu_ids ${GPU_IDS}
helloworld
User
Beiträge: 10
Registriert: Mittwoch 3. April 2019, 09:18

Das eben gepostete Skript wurde dann im Ubuntu Terminal als Shell-Skript aktiviert. Es ist auch gestartet, hat dann aber mit dieser Fehlermeldung abgebrochen:
File "scripts/train_model.py", line 3
DATASET=${1:"-dna"}
^
SyntaxError: invalid syntax
Mir ist jetzt leider nicht klar, wo das Shell Skript als Python ausgefuehrt wurde, da es im Terminal als Shell-Skript aktiviert wurde.

Danke schonmal!
Benutzeravatar
__blackjack__
User
Beiträge: 14040
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@helloworld: Was heisst „als Shell-Skript aktiviert“? Und was steht in `scripts/train_model.py` drin?
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
helloworld
User
Beiträge: 10
Registriert: Mittwoch 3. April 2019, 09:18

Das hier ist das scripts/train_model.py:

#!/bin/bash -x



DATASET=${1:-dna}

N_ITER=50000

RUN_DIR="saved_models/${DATASET}"

PATH_DATASET_ALL_CSV="data/csvs/${DATASET}.csv"

PATH_DATASET_TRAIN_CSV="data/csvs/${DATASET}/train.csv"

GPU_IDS=${2:-0}



DATASET_KWARGS="{\

\"transform_signal\": [\"fnet.transforms.Normalize()\", \"fnet.transforms.Resizer((1, 0.37241, 0.37241))\"], \

\"transform_target\": [\"fnet.transforms.Normalize()\", \"fnet.transforms.Resizer((1, 0.37241, 0.37241))\"] \

}"

BPDS_KWARGS="{\

\"buffer_size\": 1 \

}"



cd $(cd "$(dirname ${BASH_SOURCE})" && pwd)/..



python scripts/python/split_dataset.py ${PATH_DATASET_ALL_CSV} "data/csvs" --train_size 0.75 -v

python train_model.py \

--n_iter ${N_ITER} \

--path_dataset_csv ${PATH_DATASET_TRAIN_CSV} \

--dataset_kwargs "${DATASET_KWARGS}" \

--bpds_kwargs "${BPDS_KWARGS}" \

--path_run_dir ${RUN_DIR} \

--gpu_ids ${GPU_IDS}
helloworld
User
Beiträge: 10
Registriert: Mittwoch 3. April 2019, 09:18

Im Ubuntu Terminal wurde folgendes eingegeben: (und damit das sh Skript aktiviert/ gestartet)
chmod u+x ./train_model.sh

Damit wurde das Skript gestartet. Im Skript selbst (s.oben) steht dann jedoch irgendwann: python train_model.py
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Du hast da mit einem Shellskript das ursprüngliche Python-Skript überschrieben. Fang nochmal von vorne an.
helloworld
User
Beiträge: 10
Registriert: Mittwoch 3. April 2019, 09:18

Hmm, ok. Danke!
Benutzeravatar
snafu
User
Beiträge: 6866
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Man kann einer Programmiersprache nicht einfach ein Skript in einer "Fremdsprache" vorsetzen. Python versteht nur Python. Es kann Bash und andere Shell-Syntax genau so wenig verstehen wie PHP oder JavaScript. Du hast da irgendwo ein Beispiel übernommen, das für eine andere Sprache gedacht ist.

Am Anfang deiner Datei steht #!/bin/bash -x, was ja auf die Bash hindeutet. Das Skript sollte, sofern es via chmod +x deinskript.sh ausführbar gemacht wurde, dann auch in der Bash laufen. Der Aufruf dazu ist ./deinskript.sh bzw eine andere Pfadangabe falls du nicht im selben Ordner wie das Skript bist. Wie da plötzlich Python ins Spiel kommt, lässt sich aus deinen Angaben nicht erklären.
Benutzeravatar
__blackjack__
User
Beiträge: 14040
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@snafu: Python kommt ins Spiel weil das in dem zuerst gezeigten Bash-Skript explizit mit Python aufgerufen wird. Das hat als letzte Anweisung ja das hier stehen:

Code: Alles auswählen

# …

python train_model.py \

       --n_iter ${N_ITER} \

       --path_dataset_csv ${PATH_DATASET_TRAIN_CSV} \

       --dataset_kwargs "${DATASET_KWARGS}" \

       --bpds_kwargs "${BPDS_KWARGS}" \

       --path_run_dir ${RUN_DIR} \

       --gpu_ids ${GPU_IDS}
Und da ist dann egal das bei `train_model.py` die Bash in der She-Bang-Zeile steht.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
helloworld
User
Beiträge: 10
Registriert: Mittwoch 3. April 2019, 09:18

@blackjack, genau: es ist ein shell skript und python wird aktiviert. Zu meinem Verstaendnis, kommt Python erst an der Stelle ins Spiel, wo es steht und beieht sich auf die nachfolgenden Dinge :

python train_model.py \

--n_iter ${N_ITER} \

--path_dataset_csv ${PATH_DATASET_TRAIN_CSV} \

--dataset_kwargs "${DATASET_KWARGS}" \

--bpds_kwargs "${BPDS_KWARGS}" \

--path_run_dir ${RUN_DIR} \

--gpu_ids ${GPU_IDS}

ODER, so verstehe ich es, wird das gesamte Skript von python gelesen?

Das merkwuerdige ist, dass ich meine Anaconda Umgebung extra auf python 2 (2.7.8) eingestellt habe, ich im terminal aber auch Syntax Error bekomme, wenn ich im Skript nicht auf python3 train_model.py aendere. Koennte das das Problem sein?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte den vollen SyntaxError posten, und bitte auch den INHALT von train_model.py.
Antworten