2017-10-13 2 views
0

Also habe ich ein Python-Programm geschrieben, und was ich versuche, ist Windows-Verknüpfung zum Programm zu erstellen und sicherzustellen, dass beim Ausführen der Verknüpfung nicht nur die Software ausgeführt wird, sondern auch das aktuelle Verzeichnis, das die Verknüpfung ist at würde als sys.argv übergeben werden, damit ich etwas damit im Programm machen könnte. Ich weiß, dass für Windows-Verknüpfung können Sie etwas tun wie folgt:Wie Übergeben aktuelles Verzeichnis in Windows-Verknüpfungsziel?

"C:\Documents and Settings\Administrator\Desktop\hello.py" --somevalue 

Argumente in das Ziel übergeben. Ich frage mich, wie ich es für meinen speziellen Fall arbeiten lassen könnte. Wenn wir zum Beispiel die Verknüpfung auf Desktop setzen und die Verknüpfung ausführen, startet die Python-Software mit sys.argv[1]="C:\Users\username\Desktop".

+0

Ich glaube nicht, dass es eine Möglichkeit gibt, es als Argument zu übergeben. Sie wollen nicht das aktuelle Verzeichnis (das mit ['os.getcwd()'] (https://docs.python.org/3/library/os.html#os.getcwd) in der Skript selbst). Was Sie brauchen, ist eine Möglichkeit, nicht nur zu erkennen, dass es von einer Verknüpfung statt direkt ausgeführt wurde, sondern auch von der Position der Verknüpfung, die verwendet wurde. Ich bezweifle, dass das auch möglich ist. – martineau

+0

Warum genau brauchen Sie diese Information überhaupt? – martineau

+0

Sie können das aktuelle Arbeitsverzeichnis in der Verknüpfung festlegen. Es muss nicht als Befehlszeilenparameter übergeben werden. – IInspectable

Antwort

2

Sie können das aktuelle Verzeichnis für die ausgeführte Anwendung in einem .LNK angeben. Dies ist die normale Vorgehensweise, wenn Sie von einem bestimmten Verzeichnis abhängig sind.

Wenn Sie aus irgendeinem Grund tatsächlich benötigen Informationen über die LNK erhalten Sie die GetStartupInfo Windows-Funktion (mit ctypes Ich gehe davon aus), und wenn das STARTF_TITLEISLINKNAME Bit in STARTUPINFO.dwFlags dann gesetzt wird, enthält nennen muss STARTUPINFO.lpTitle den Pfad zum .LNK die Benutzer verwendet, um die Anwendung zu starten.

+1

Es ist nicht schwer mit Ctypes, aber es ist noch einfacher mit PyWin32 installiert: 'import win32process;' 'STARTF_TITLEISLINKNAME = 0x800;' 'si = win32process.GetStartupInfo();' 'linkname = si.lpTitle wenn si.dwFlags & STARTF_TITLEISLINKNAME sonst keine '. – eryksun

+0

@eryksun Hey vielen Dank für den Rat, aber ich habe versucht, und es gibt linkname = None immer wenn ich versuchte, die Software direkt oder über die Verknüpfung –

+0

@HansongLi zuzugreifen, wahrscheinlich die .py Erweiterung ist mit der py [w] .exe verbunden Startprogramm. Es führt python [w] .exe als untergeordneten Prozess aus, der mit 'lpTitle' als' NULL' erstellt wurde und den ausführbaren Pfad für python [w] .exe als Titel verwendet. Dies wird nicht das Flag "STARTF_TITLEISLINKNAME" haben, weshalb der obige Ausdruck 'linkname' auf' None' setzt. Ich nehme an, der Launcher könnte 'GetStartupInfo' aufrufen, um einige Details von seinen eigenen Startup-Informationen zu übernehmen. Als Workaround müssen Sie die Verknüpfung erstellen, indem Sie den vollständig qualifizierten Pfad zu python [w] .exe (d. H. 'Sys.executable') mit dem Skript als Argument verwenden. – eryksun

Verwandte Themen