os.readlink() - komme damit nicht ganz klar

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
WalterT
User
Beiträge: 31
Registriert: Dienstag 5. Dezember 2017, 16:00

Liebe Freunde,

meine HotFolder-Anwendung ist schon sehr weit gediehen und auch schon im Einsatz bei Kunden. Nun möchte ich die unterstützten Dateitypen um die Endung .lnk erweitern und versuche folgendes:

Code: Alles auswählen

        if file_extension.lower() == ".lnk":
            input_folder_element = os.readlink(input_folder_element)
Ich möchte einfach nur dem Link folgen und den absoluten Pfad in die Variable übernehmen und dann einfach weiter verarbeiten.

Fehlermeldung:

File "C:/Users/Administrator/Desktop/Pinwand/script.py", line 110, in scan_input
input_folder_element = os.readlink(input_folder_element)

OSError: [WinError 4390] Die Datei oder das Verzeichnis ist kein Analysepunkt: 'C:\\Users\\Administrator\\Desktop\\Pinwand\\Input\\Angebot.pdf - Verknüpfung.lnk'


Die Zieldatei existiert in "S:\Daten\Angebot.pdf" und genau das brauche ich in input_folder_element

Bitte um Hilfe.
Danke und lg
Walter
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

`os.readlink` verfolgt symbolische Links im Dateisystem. Du hast hier aber eine .lnk-Datei und das ist etwas ganz anderes.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1020
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Eine .link Datei ist ein Verweis auf ein Programm oder eine Datei, der ein Programm zugeordnet ist.
Eine .link-Datei ist kein symlink. Die symlinks gibt es bei NTFS nicht. Es gibt was ähnliches bei NTFS mit einem anderen Namen.

Bei der .link-Datei handelt es sich um ein binäres Format.
Hier mal ein Beispiel von meinem Desktop:

Code: Alles auswählen

L        ▒      F▒       y▒M▒▒▒'▒b▒▒▒ ▒▒▒ ▒@                    ▒ P▒O▒ ▒:i►▒▒+00▒↓ /C:\                   ▒ 1     1P#I◄ PROGRA~2  ▒      ♦ ▒▒sN▒&1P#I.   ▒-♥           V
     i▒▒ P r o g r a m   F i l e s   ( x 8 6 )   @ s h e l l 3 2 . d l l , - 2 1 8 1 7   ↑ h 1     1P#I► ICONSF~1  P     ♦ ▒▒1P#I1P#I.   MC                   Ĝ▒ I c o n s   f r o m   F i l e   ↑ f 2  ▒@ ML▒▒  extraico.exe  J         ♦ ▒▒1P#I1P#I.   ▒▒♣   ♠                   e x t r a i c o . e x e      b            -       a   ◄   ♥ ▒
▒l►    C:\Program Files (x86)\Icons from File\extraico.exe  9 . . \ . . \ . . \ P r o g r a m   F i l e s   ( x 8 6 ) \ I c o n s   f r o m   F i l e \ e x t r a i c o.
▒▒A▒YT►▒▒k8▒◄▒♦▒&[tk▒▒d3q▒G▒   F i▒▒ e 1SPS▒▒XF▒L8C▒▒▒&▒m▒mo n♦s   f r.o mS -F1i-l5e-►2 1♣- 9*9 1▒7 8 2 9 6▒1Z-▒1▒7▒9▒0▒7▒0▒9 9`1 7♥- 1X3 3 4 5d0s1t7p8f79-t190T0d1q▒G▒9
   1SPS▒mD▒▒pH▒H@.▒=x▒   h    H   U]iaQ▒;C▒▒Ȭ0▒
Die Spezifikation des Formats findest du hier: https://github.com/libyal/liblnk/blob/m ... t.asciidoc
Willst du wissen auf was für ein Programm/Datei der Link verweist?
Falls ja, müsste man entweder einen Parser für die LINK-Dateien bauen oder besser noch: Gucken es schon was gibt.
Ich habe jetzt leider nichts passendes in der Kürze gefunden.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Unter Windows gibt's da wohl eine API direkt von Windows. Macht ja auch Sinn. :-)
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

DeaD_EyE hat geschrieben: Donnerstag 23. Januar 2020, 14:29Eine .link-Datei ist kein symlink. Die symlinks gibt es bei NTFS nicht. Es gibt was ähnliches bei NTFS mit einem anderen Namen.
Windows unterstützt sowohl symbolische als auch harte Verknüpfungen auf Dateisystemebene. Sie sind dort unüblich und nicht so verwachsen wie unter unixoiden Systemen, aber sie sind vorhanden.

Code: Alles auswählen

D:\>mklink b.txt a.txt
symbolische Verknüpfung erstellt für b.txt <<===>> a.txt

D:\>c:\Python37-32\python.exe
Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 21:26:53) [MSC v.1916 32 bit (Inte
l)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.readlink("d:/b.txt")
'a.txt'
WalterT
User
Beiträge: 31
Registriert: Dienstag 5. Dezember 2017, 16:00

es stimmt schon, mit symlinks hat eine .lnk-Datei unter Windows nichts zu tun. Eine .lnk-Datei ist einfach ein Wegweiser zu einer anderen Datei oder Ordner. Diesen kann man auch mit mklink nicht erzeugen.

os.readlink() ist also eine Sackgasse. Ich habe jetzt viel gegoogelt und einiges ausprobiert, es scheitert aber meist daran, dass diese Libs für Python < 3.7 programmiert sind und einen Fehler nach dem anderen schmeissen (Ich verwende 3.7) oder aber meine Kenntnisse fehlen, solche Bibliothken in meine Software einzubinden wenn es nicht mit pip install geht.

Vielleicht weiß jemand doch noch was...
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Naja, wenn man nach "python follow .lnk" googelt kommt als erstes das hier: https://stackoverflow.com/questions/397 ... -in-python
WalterT
User
Beiträge: 31
Registriert: Dienstag 5. Dezember 2017, 16:00

ja, schon, das habe ich gelesen. Wollte es probieren und scheitere an dem Import von "win32com.client" Ich weiß nicht, was das ist, wo man es her kriegt und wie man es installiert, sodass man es verwenden kann... bin eben doch noch ein Anfänger, sorry

Code: Alles auswählen

import sys
import win32com.client 

shell = win32com.client.Dispatch("WScript.Shell")
shortcut = shell.CreateShortCut("t:\\test.lnk")
print(shortcut.Targetpath)
__deets__
User
Beiträge: 14537
Registriert: Mittwoch 14. Oktober 2015, 14:29

Hast du mal gegoogelt was das ist? Und wie man das installiert?
WalterT
User
Beiträge: 31
Registriert: Dienstag 5. Dezember 2017, 16:00

Ich würde mich sicher nicht an die Community wenden, wenn ich durch einfaches Googlen weiter kommen würde...

Selbstverständich habe ich versucht, die nötigen Informationen zu erhalten, leider komme ich damit nicht klar.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

Ich weiß nicht, nach was Du gegooglt hast: https://www.google.com/search?q=install+win32com
Da kommt dann sogar eine passend Antwort gleich ganz oben.
__deets__
User
Beiträge: 14537
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und die Community weiß nicht, welchen Wissensstand du hast, was du versuchst hast, was konkret nicht funktioniert hat. Da ist es durchaus dein Job, für Klarheit zu sorgen. Aber einschnappen ist bestimmt auch eine gute Strategie!
WalterT
User
Beiträge: 31
Registriert: Dienstag 5. Dezember 2017, 16:00

Sirius3 hat geschrieben: Donnerstag 23. Januar 2020, 18:58 Ich weiß nicht, nach was Du gegooglt hast: https://www.google.com/search?q=install+win32com
Da kommt dann sogar eine passend Antwort gleich ganz oben.
Diesen Eintrag kenne ich, habe ihn befolgt und bin gescheitert.
if file_extension.lower() == ".lnk":
shell = win32com.client.Dispatch("WScript.Shell")
shortcut = shell.CreateShortCut(input_folder_element)
print(shortcut.Targetpath)
ergibt
Traceback (most recent call last):
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\site-packages\win32com\client\dynamic.py", line 89, in _GetGoodDispatch
IDispatch = pythoncom.connect(IDispatch)
pywintypes.com_error: (-2147221008, 'CoInitialize wurde nicht aufgerufen.', None, None)
Mein Wissensstand reicht nicht aus, um diesen Knopf aufzulösen.. Ich verstehe nicht, warum da "shell.CreateShortCut" verwendet wird, ich will den Link ja lesen, nicht erzeugen. Aber das ist nur meine oberflächliche Sicht.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

WalterT hat geschrieben: Freitag 24. Januar 2020, 07:14 Mein Wissensstand reicht nicht aus, um diesen Knopf aufzulösen.
Meiner auch nicht. Aber ich habe Google bemüht und bin darauf gestoßen, dass wohl u.a. bei der Verwendung von Multithreading `pythoncom.CoInitialize()` verwendet werden muss (siehe https://stackoverflow.com/questions/267 ... 8#27966218). Microsoft weist in diesem Kontext ebenfallsdarauf hin: "Before an application can create and resolve shortcuts, it must initialize the component object library by calling the CoInitialize function."
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

@WalterT: Grundsätzlich funktioniert übrigens der Code-Snipped oben um das Target des Links zu ermitteln.
Hintereinander in der interaktiven Shell weggetippt, tut es genau das was es soll.
Ist das bei dir anders? Tritt das Problem bei exakt dem Snipped auf, wenn du es in der interaktiven Shell ausführst? Oder wenn du das irgendwo in deinem Programm ausführst?
schon im Einsatz bei Kunden
bin eben doch noch ein Anfänger
:roll:
DMD-OS
User
Beiträge: 165
Registriert: Freitag 28. Dezember 2018, 13:52

hoffe es hilft:
https://github.com/mhammond/pywin32/releases
etwas runterscrollen und testen
WEISS ABER NICHT, WIE SICHER DAS IST :(
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

DMD-OS hat geschrieben: Freitag 24. Januar 2020, 11:11 hoffe es hilft:
https://github.com/mhammond/pywin32/releases
Was willst du mit diesem Beitrag jetzt sagen? Auf der verlinkten Seite finden sich Installer für pywin32. Das ist aber doch bereits beim Fragesteller installiert.
WalterT
User
Beiträge: 31
Registriert: Dienstag 5. Dezember 2017, 16:00

sparrow hat geschrieben: Freitag 24. Januar 2020, 09:12 @WalterT: Grundsätzlich funktioniert übrigens der Code-Snipped oben um das Target des Links zu ermitteln.
Hintereinander in der interaktiven Shell weggetippt, tut es genau das was es soll.
Ist das bei dir anders? Tritt das Problem bei exakt dem Snipped auf, wenn du es in der interaktiven Shell ausführst? Oder wenn du das irgendwo in deinem Programm ausführst?
schon im Einsatz bei Kunden
bin eben doch noch ein Anfänger
:roll:
Ich probier das gleich aus.....

Einsatz beim Kunden: der hat die allererste Version, da konnte ich nur .pdf verarbeiten und eigentlich hat es mein Sohnemann programmiert, ich hab es dann weitergeführt (auch da gibts hier threads von mir), mittlerweile kann ich mit sehr vielen Dateitypen umgehen (docx, xlsx, txt, jpg,...) und habe eine Testinstallation bei einem zweiten Kunden.
Ich bin nicht einer, der so schnell aufgibt und ich verbeisse mich oft tagelang in ein Problem, nur wenn ich gar nicht mehr weiterkomme, suche ich mir Hilfe....

Wen es interessiert: was macht meine Software? man legt eine (fast) beliebige Datei in einen definierten Ordner und der Serverteil der Software generiert daraus ein A4-Blatt als .jpg. Dieses kann man im Browser ansehen, wobei es automatisch skaliert bis zu 3x8 Blatt auf einem 4K-Monitor (kleiner kann man es nicht mehr lesen). Funktioniert in Echtzeit und dient als Anzeige von temporären Informationen, in einem Fall legt der Kunde (Dachdecker) Kleinaufträge auf seine Pinwand (so heißt die Software) ... ist ganz cool geworden
WalterT
User
Beiträge: 31
Registriert: Dienstag 5. Dezember 2017, 16:00

GELÖST...

Ich habe das ausprobiert. In der Shell funktioniert alles, wie es soll, im Programm kommt die Meldung
pywintypes.com_error: (-2147221008, 'CoInitialize wurde nicht aufgerufen.', None, None)
Da läuft wohl einiges parallel im Gegensatz zur einfachen Shell...

Nach dem Motto: Gib dem Affen Zucker dachte ich mir: rufst halt CoInitialize auf, nur wie und wo?

Code: Alles auswählen

import pythoncom
...
pythoncom.CoInitialize()
Nach einigem Probieren funktionierte es, als ich den Funktionsaufruf in die "obereste" Funktion reingeschreiben habe.

Code: Alles auswählen

def start_script():
    pythoncom.CoInitialize()
    delete_images()
    try:
        while True:
            scan_input()
            time.sleep(SLEEP_TIMEOUT)
    except KeyboardInterrupt:
        print("99 Keyboard interrupt - exiting")
Danke an alle, die sich beteiligt haben
lg
Walter
Antworten