Push-Nachrichten von MacTechNews.de
Würden Sie gerne aktuelle Nachrichten aus der Apple-Welt direkt über Push-Nachrichten erhalten?
Forum>Entwickler>Warum hat Python in "Kurzbefehle" dieses Problem ?

Warum hat Python in "Kurzbefehle" dieses Problem ?

MrChad26.07.2315:38
Ich arbeite hier mit dem Python-Programm icloudpd und erzeuge mir damit eine vollständige Kopie der iCloud-PhotoLibrary auf einer externen Platte. Interaktiv arbeitet das Programm genau wie erwartet.

Auf der Kiste (MacOS 13.4.1c) befindet sich die Python-Version 3.9.6, die im Rahmen von XCode mitgekommen war.

Um jetzt den Programmstart von icloudpd zu automatisieren, kam ich auf die Idee, es über Kurzbefehle zu versuchen. Eigentlich nicht weiter aufregend:
  • 2 Argumente setzen, 1 Passwort abfragen
  • die Argumente an eine Shell-Skript weitergeben
  • das Shell-Skript gibt die Argumente seinerseits an icloudpd weiter
Sollte eigentlich problemlos klappen.

Interaktiv starte ich das Programm z.B. so
cd ~/Library/Python/3.9/bin
./icloudpd --directory /Volumes/extern1/PhotoLibCopy/_EIN_ORDNER_ --username _EINE_APPLEID_ --password _EIN_PASSWORD_ --dry-run

Wenn ich das Gleiche in einen einfachen Kurzbefehl verpacke, schmiert mir Python regelmäßig mit einem Stacktrace ab. Den Trace interpretiere ich so, dass die übergebenen Argumente irgendwo unterwegs verloren gegangen sind.


Wenn ich zur Kontrolle das Shell-Skript mal mit echo's garniere, sieht man klar, das die Kurzbefehle-App die Argumente korrekt an das Skript übergeben hat.
Ich habe schon einige Varianten durchgetestet, unter anderem auch den Direktstart des Python-Skripts ganz ohne Shell dazwischen. Das Ergebnis bleibt immer gleich.


Was mich zu der finalen Frage bringt:
  • Was ist an Kurzbefehlen so anders, dass ein ansonsten funktionierendes Python-Programm innerhalb von Kurzbefehlen immer abschmiert ?
-2

Kommentare

marm26.07.2315:54
Übergebe die Variablen versuchsweise nicht als $1, $2 sondern als Variablen aus Kurzbefehle. So ungefähr wie hier mit "Text" und "Auswahl". Hier ein Ruby-Skript-Anfang:


Warum startest du nicht direkt Python, sondern ein Shell-Skript? Bei 'Shell' kannst Du Python auswählen. Ich nehme mal an, dass das Python-Skript so nicht weiß, dass vorher "cd ~/Library/Python/3.9/bin" durchgeführt wurde.
Ich habe schon mehrere Python- und Ruby-Skripte über Kurzbefehle zum Laufen gebracht.

0
MrChad26.07.2316:18
marm
Warum startest du nicht direkt Python, sondern ein Shell-Skript? Bei 'Shell' kannst Du Python auswählen.
Da war ich schon und es macht keinen Unterschied.

Mit einfacheren Argumenten (hier: --dry-run --help) funktioniert es genau so, wie ich das will. Irgendwie kommt bloß der Inhalt der Optionen nicht durch
-1
marm26.07.2316:24
ok, kannst Du dein Shell-Skript in eine Kommando-Zeile packen? Ungefähr so:
cd ~/Library/Python/3.9/bin && ../icloudpd --directory $1 --username $2 --password $3 --dry-run
Weil das Python-Skript sonst nicht weiß, dass das Verzeichnis gewechselt hat. Das Problem hatte ich anfänglich zumindest ... Und wie gesagt, kannst du die Variablen auch von Kurzbefehle direkt nutzen statt $x.
0
Weia
Weia26.07.2316:29
Was passiert, wenn Du statt ~ explizit den Pfadnamen angibst?
„“I don’t care” is such an easy lie. (The Warning, “Satisfied”)“
-1
Weia
Weia26.07.2316:39
marm
ok, kannst Du dein Shell-Skript in eine Kommando-Zeile packen? Ungefähr so:
cd ~/Library/Python/3.9/bin && ../icloudpd --directory $1 --username $2 --password $3 --dry-run
Ääähh – warum nicht einfach
/Users/mrchad/Library/Python/3.9/bin/icloudpd --directory $1 --username $2 --password $3 --dry-run
„“I don’t care” is such an easy lie. (The Warning, “Satisfied”)“
0
MrChad26.07.2316:55
  • mit und ohne Shell
  • mit und ohne cd - eine Zeile
  • mit und ohne ~
Da waren wir überall schon.

Es sieht stark so aus, als ob das Programm die übergebenen Argumente nicht oder falsch auseinanderfieselt.
Ich hatte ihn zwischenzeitlich auch mal so weit, dass er wenigstens über den Path herumnölt - allerdings grundlos.

Ich neige jetzt dazu, das Kurzbefehle-Experiment zu beenden und andere Wege zu beschreiten. Gibt ja noch Optionen.
-1
marm26.07.2317:00
Und Variablen einsetzen hast Du auch probiert statt Argumente?
0
Weia
Weia26.07.2318:48
MrChad
  • mit und ohne ~
Da waren wir überall schon.
Du vielleicht, wir nicht. Nirgendwo steht, dass Du schon einmal probiert hattest, ~ zu eliminieren.

Deine Problembeschreibung klingt einfach sehr nach fehlendem Environment. sh statt zsh als Shell zu nutzen, wäre vielleicht auch noch einen Versuch wert.
„“I don’t care” is such an easy lie. (The Warning, “Satisfied”)“
0
MrChad27.07.2312:52
Zwischenstand jetzt:
  • Der DAE (Dümmste Anzunehmenste Einzeiler) ohne jedes cd oder ~ etc. funktioniert interaktiv einwandfrei.
  • In Kurzbefehle crasht Python, egal welche Shell man angibt
  • Übergabe der Argumente als eingesetzte Variable macht (erwartungsgemäß) keinen Unterschied.
  • Wenn ich das DAE-Skript zum LaunchAgent umbaue, gibt's Hinweise auf "no permission" mit dem ansonsten gleichen Python-Crash.
Die aktuelle Hypothese geht dahin, dass sowohl in Kurzbefehle als auch als LaunchAgent dem Python-Skript irgendwelche Rechte auf die AppleID/iCloud verweigert werden.
Den Rest des Tages habe ich leider keine Zeit mehr, das weiter zu verfolgen.
-1
ssb
ssb27.07.2314:45
Warum startest du das Skript nicht mit python3 <pfad>/icloudpd <argumente>?

Damit macOS es überhaupt als Python Script erkennt wird es ein hashbang haben müssen. Es ist gut möglich, dass der hashbang dann in der Shell deiner Wahl mit deinem Environment ausgeführt wird und dann eine Shell gemäß des hashbangs öffnet, in dem das Environment fehlt. Außerdem muss das Python Skript selbst dann nicht ausführbar sein.
Diesbezüglich könnte sich der Aufruf im Terminal von einem Aufruf aus Kurzbefehle unterscheiden.

Wenn du Python mit dem Namen/Pfad deines Skripts öffnest, klappt es vielleicht besser. Das ist jetzt aber einfach nur eine reine Vermutung ohne irgendwas selbst geprüft zu haben.

Oh, und bist du dir sicher, dass argv eine Liste ist und nicht ein einzelner String?
0
MrChad28.07.2313:58
Ihr werdet lachen (oder weinen):
So habe ich das Ganze jetzt ans Laufen bekommen.



iCloudPD.command :


Das Kurzbefehl-Skript habe ich in eine .app konvertiert und kann die ganz wunschgemäß als unsichtbarer Dauerläufer beim Login starten. Bisschen clumsy, aber für's Erste OK.

So ganz zufrieden bin ich trotzdem nicht und es bleiben offene Fragen, was da eigentlich schiefläuft:

Es fiel mir auf, dass das Paket nur in x86-Version existiert und unter Rosetta läuft. Keine Ahnung, ob das eine Bedeutung hat und leider kenn ich nix von Python und kann das Ganze nicht neu kompilieren.

Auf der Kiste lungern auch noch ein paar andere Python-Installationen rum, insbes. von Homebrew und MacPorts. Anscheinend bringt ja jedes zweite Paket irgendwelche Python-Fragmente mit. Gefällt mir eigentlich gar nicht und auch da habe ich keine Ahnung, ob das irgendwas ausmacht.

Und wenn das alles großer Murks ist, dann habe ich zumindest etwas über Kurzbefehle gelernt ...
-1

Kommentieren

Diese Diskussion ist bereits mehr als 3 Monate alt und kann daher nicht mehr kommentiert werden.