Übernommene Argumente im Interpreter

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
Pythagon
User
Beiträge: 52
Registriert: Mittwoch 3. Juli 2019, 18:21

Hallo zusammen,

via VBA Shell-Objekt habe ich einen String an Python übergeben und im Python-Interpreter sehe ich auch die entsprechende Bezeichnung des Strings in der obersten Commandozeile sobald der Interpreter sich öffnet. Das Ganze sieht so aus:
'C:\Users\Herbert_Meisel\AppData\Local\Programs\Python\Python37-32\python.exe C:\Users\Public\Geldanlage\Pivots\Dividendenbewertung\Scraper.py', 'x'
Wenn ich das Ganze in VBA mit einem "& x" übergebe dann sieht es folgendermaßen aus:
'C:\Users\Herbert_Meisel\AppData\Local\Programs\Python\Python37-32\python.exe C:\Users\Public\Geldanlage\Pivots\Dividendenbewertung\Scraper.py', '&', 'x'
Nun bin ich mir nicht wirklich sicher ob die übergebene Variable bzw. das Argument "x" wirklich in dieser Zeile erscheinen sollte oder ob ich etwas falsch gemacht habe. Interessanterweise verschwinden diese Werte aus der Zeile sobald ich im Python Script den Aufruf "print(arglist)" deaktiviere.

Kann jemand daran erkennen ob ich auch die Werte für das Argument "x" erhalten haben müsste?
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Im Argumentvektor

Code: Alles auswählen

import sys
print(sys.argv)
steht alles drin, was an den Aufruf des Python-Interpreters auf der Kommandozeile mit angegeben wurde.
Pythagon
User
Beiträge: 52
Registriert: Mittwoch 3. Juli 2019, 18:21

kbr hat geschrieben: Sonntag 14. Juli 2019, 16:44 Im Argumentvektor

Code: Alles auswählen

import sys
print(sys.argv)
steht alles drin, was an den Aufruf des Python-Interpreters auf der Kommandozeile mit angegeben wurde.
Ich hätte noch erwähnen sollen, dass "arglist =sys.argv" ist. Durch print erscheinen die übergebenen Argumente zwar hinter dem Dateilink in der obersten Zeile des Interpreters sobald dieser sich öffnet aber die Werte der übergebenen Argumente sehe ich nicht. Ich möchte sicherstellen, dass die Werte übergeben wurden.
Pythagon
User
Beiträge: 52
Registriert: Mittwoch 3. Juli 2019, 18:21

Mit der count Methode von sys.argv erhalte ich keinen Wert. Gehe ich richtig in der Annahme, dass tatsächlich kein Wert übergeben wurde oder müsste ich zumindest einen Wert von null angezeigt bekommen?

Code: Alles auswählen

import sys  

arglist = sys.argv # Übergebene Werte aus VBA

print(arglist)

txt = arglist.count

print(txt)
__deets__
User
Beiträge: 14480
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du musst count schon aufrufen, wenn du meinst, da waere etwas zu zaehlen. Allerdings vermute ich mal eher du suchst len(sys.argv) fuer die Laenge der uebergebenen Argumente.

Und das sollte *mindestens* 1 sein, denn python bzw. das Skript selbst ist das erste Argument. Erst danach kommen uebergebene Argumente. Wie du sehr leicht mit der Kommandozeile statt durch das ShellExecute zu gehen ueberpruefen kannst.
Pythagon
User
Beiträge: 52
Registriert: Mittwoch 3. Juli 2019, 18:21

Len war die Methode, die ich gesucht hatte. Ich neige dazu diese beiden zu verwechseln. Besten Dank!

Nun, er zählt tatsächlich drei Argumente und damit wertet er auch das "&" als Argument. Nun stellt sich mir die Frage ob zum Argument "x" auch der entsprechende Wert (String) übergeben wurde.
Benutzeravatar
__blackjack__
User
Beiträge: 12984
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Pythagon: Grunddatentypen haben in Namen eher nichts verlorenn. Wenn man `sys.argv` schon an einen anderen Namen binden möchte, dann vielleicht `arguments`. Ich sehe aber nicht wirklich einen Grund dafür das überhaupt zu tun.

Und wenn Du diese Liste mit `print()` ausgibst, dann siehst Du doch genau was da übergeben wurde und sofern das nicht zu viele Argumente sind, kann man doch an der Ausgabe der Liste auch recht leicht sehen wie viele Elemente die enthält‽
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
__deets__
User
Beiträge: 14480
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn in der ausgegebenen Liste nicht der von dir erwartete wert drin ist, dann ist da auch nichts übergeben worden. Was aber an deinem Aufruf und nicht an Python liegt.
Pythagon
User
Beiträge: 52
Registriert: Mittwoch 3. Juli 2019, 18:21

__blackjack__ hat geschrieben: Sonntag 14. Juli 2019, 17:45 @Pythagon: Grunddatentypen haben in Namen eher nichts verlorenn. Wenn man `sys.argv` schon an einen anderen Namen binden möchte, dann vielleicht `arguments`. Ich sehe aber nicht wirklich einen Grund dafür das überhaupt zu tun.

Und wenn Du diese Liste mit `print()` ausgibst, dann siehst Du doch genau was da übergeben wurde und sofern das nicht zu viele Argumente sind, kann man doch an der Ausgabe der Liste auch recht leicht sehen wie viele Elemente die enthält‽
Weiter oben hatte ich ja erwähnt, dass ich mit print(sys.argv) zwar in der obersten Zeile des Interpreters hinter dem Link zum aufzurufenden Skript die Namen der übergebenen Argumente angezeigt bekomme (also '&' und 'x') aber den Wert für x bekomme ich nirgends angezeigt.
__deets__
User
Beiträge: 14480
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich wiederhole mich nochmal: dann ist das nicht uebergeben worden, und der Grund dafuer liegt auf der aufrufenden Seite.
Pythagon
User
Beiträge: 52
Registriert: Mittwoch 3. Juli 2019, 18:21

__deets__ hat geschrieben: Sonntag 14. Juli 2019, 17:48 Wenn in der ausgegebenen Liste nicht der von dir erwartete wert drin ist, dann ist da auch nichts übergeben worden. Was aber an deinem Aufruf und nicht an Python liegt.
Das Problem ist, ich bekomme gar keine Liste angezeigt. Da aber auf jeden Fall schonmal Namen übergeben wurden ( & bzw. x) müsste ich also wenn eine Liste erscheinen würde diese darin sehen, auch wenn keine Werte dazu übergeben worden sind.
Pythagon
User
Beiträge: 52
Registriert: Mittwoch 3. Juli 2019, 18:21

__deets__ hat geschrieben: Sonntag 14. Juli 2019, 17:57 Ich wiederhole mich nochmal: dann ist das nicht uebergeben worden, und der Grund dafuer liegt auf der aufrufenden Seite.
Dann werde ich nochmal schauen was an meinem Code in VBA nicht stimmen könnte.

Merkwürdig ist halt trotzdem, dass ich durch print(sys.argv) bewirken kann, dass '&' und 'x' nicht mehr im Interpreter auftauchen.
Pythagon
User
Beiträge: 52
Registriert: Mittwoch 3. Juli 2019, 18:21

... durch Herausnehmen von print(sys.argv) wollte ich sagen.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Du musst von aufrufender Seite nicht x übergeben, sondern den Wert von x. Sonst kommt in Python eben nur der Name des Bezeichners an.
Pythagon
User
Beiträge: 52
Registriert: Mittwoch 3. Juli 2019, 18:21

kbr hat geschrieben: Sonntag 14. Juli 2019, 18:09 Du musst von aufrufender Seite nicht x übergeben, sondern den Wert von x. Sonst kommt in Python eben nur der Name des Bezeichners an.
ok, besten Dank! Dieser Sachverhalt ist dann eher ein Fall für das VBA Forum.
Antworten