Prg von Kommandozeile gestartet?

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.
Antworten
api
User
Beiträge: 181
Registriert: Donnerstag 7. August 2008, 21:23

Hallo,

gibt es eigentlich eine Möglichkeit, um in einem Python-Prg festzustellen, ob dieses von der Kommandozeile aus gestartet wurde?

Hintergrund meiner Frage ist, dass ich ein Python-Programm entweder direkt über die Kommandozeile aufrufen kann, aber ebenso aus einem anderen Programm heraus. Nun gibt es aber einen Parameter, der nicht auf der Kommandozeile verwendet werden darf. Dieses "Vergehen" möchte ich in dem aufgerufenen Prg abfangen.
:?:
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Kann ich mir nicht vorstellen; zudem klingt mir das nach einem Thema, das sicherlich nicht Betriebssystem unabhängig wäre. Insofern gibt es da wenn nur Speziallösungen durch umständliche Verränkungen.

Ich würde das einfach gut dokumentieren und mich darauf verlassen, dass der Benutzer die Anleitung liest.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
api
User
Beiträge: 181
Registriert: Donnerstag 7. August 2008, 21:23

@hyperion: Ja. Dokumentiert ist es - und alle Beteiligten wissen es eigentlich auch, aber so als letzte Absicherung wäre es recht gut gewesen, es im Prg abzufangen.

Ok. Es scheint - wie ich mir schon gedacht habe - nicht so einfach zu sein.

Danke dir trotzdem.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Ich versteh den Sinn nicht. Was willst du den verbieten?
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

Reicht ein "sys.stdin.isatty()" (bzw. sys.stdout...) vielleicht schon?
api
User
Beiträge: 181
Registriert: Donnerstag 7. August 2008, 21:23

@jbs: Der Sinn besteht darin, dass wenn der Aufruf des anderen Prgs aus einem bestimmten Prg geschieht, dieser Parameter dafür sorgt, dass Dateien überschrieben werden - also zB:

prg_name --browser --write_statistic

Der Parameter "--write_statistic" führt dazu, dass eine bestimmte Statistik geschrieben wird.

Da man dieses Prg aber auch von der Kommandozeile starten kann, und auf keinen Fall diese Statistik geschrieben werden darf, sollte unterbunden werden, dass es einen Aufruf wie diesen gibt:

prg_name --browser --write_statistic

Von der Kommandozeile ist nur erlaubt:

prg_name --browser

(bzw. alle Möglichkeiten ohne "--write_statistic")


@b.esser-wisser: Wie soll ich das verwenden? Das verstehe ich jetzt nicht.. :(
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@api: Na dann erstelle doch einfach zwei Wrapper-Scripte, die für den Stand-alone- und für den Embedded-Gebrauch angepasst sind. Letztlich ist der Effekt aber auch, dass man die Doku lesen muss :-D

Vielleicht überflüssig aber dennoch mal der Hinweis: Falls möglich nutze doch nicht das ausführbare CLI-Script von einem anderen Programm aus, sondern das Modul. Damit wäre der Kommandozeilenparameter obsolet :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Vielleicht könnte eine Möglichkeit darin bestehen, dass Du beim Start Deines Programmes überprüfst, welche Prozesse/Programme gerade aktiv sind. Wenn das aufrufende Programm, das den --write_statistic Parameter übergeben darf, dabei ist, kann man davon ausgehen, dass der Programmstart auch von diesem initiiert wurde.

Ok, ist nur eine halbsichere Lösung, lässt sich natürlich leicht umgehen....

Mir fällt nix besseres ein, sorry... :-(

Gruß
mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Stephan256
User
Beiträge: 1
Registriert: Donnerstag 16. September 2010, 19:27

Zumindest unter Linux könntest du mit os.environ die Umgebungsvariablen überprüfen ob z.B. die Variable PS1 gesetzt ist was darauf hindeutet, dass das Programm in einer Shell ausgeführt wird. Dies ist nicht unbedingt 100% zuverlässig.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Wird das andere Programm aber von einer Shell gestartet, vererbt es dann auch `PS1` weiter. Insofern sogar noch fragiler.

Ich denke du faehrst mit zwei Interfaces - wie von Hyperion vorgeschlagen - am besten.
Antworten