Seite 1 von 1

os.readlink() - komme damit nicht ganz klar

Verfasst: Donnerstag 23. Januar 2020, 12:55
von WalterT
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

Re: os.readlink() - komme damit nicht ganz klar

Verfasst: Donnerstag 23. Januar 2020, 13:33
von /me
`os.readlink` verfolgt symbolische Links im Dateisystem. Du hast hier aber eine .lnk-Datei und das ist etwas ganz anderes.

Re: os.readlink() - komme damit nicht ganz klar

Verfasst: Donnerstag 23. Januar 2020, 14:29
von DeaD_EyE
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.

Re: os.readlink() - komme damit nicht ganz klar

Verfasst: Donnerstag 23. Januar 2020, 14:41
von __blackjack__
Unter Windows gibt's da wohl eine API direkt von Windows. Macht ja auch Sinn. :-)

Re: os.readlink() - komme damit nicht ganz klar

Verfasst: Donnerstag 23. Januar 2020, 14:51
von sparrow
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'

Re: os.readlink() - komme damit nicht ganz klar

Verfasst: Donnerstag 23. Januar 2020, 16:04
von WalterT
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...

Re: os.readlink() - komme damit nicht ganz klar

Verfasst: Donnerstag 23. Januar 2020, 16:24
von sparrow
Naja, wenn man nach "python follow .lnk" googelt kommt als erstes das hier: https://stackoverflow.com/questions/397 ... -in-python

Re: os.readlink() - komme damit nicht ganz klar

Verfasst: Donnerstag 23. Januar 2020, 16:47
von WalterT
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)

Re: os.readlink() - komme damit nicht ganz klar

Verfasst: Donnerstag 23. Januar 2020, 16:48
von __deets__
Hast du mal gegoogelt was das ist? Und wie man das installiert?

Re: os.readlink() - komme damit nicht ganz klar

Verfasst: Donnerstag 23. Januar 2020, 17:15
von WalterT
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.

Re: os.readlink() - komme damit nicht ganz klar

Verfasst: Donnerstag 23. Januar 2020, 18:58
von Sirius3
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.

Re: os.readlink() - komme damit nicht ganz klar

Verfasst: Donnerstag 23. Januar 2020, 22:32
von __deets__
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!

Re: os.readlink() - komme damit nicht ganz klar

Verfasst: Freitag 24. Januar 2020, 07:14
von WalterT
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.

Re: os.readlink() - komme damit nicht ganz klar

Verfasst: Freitag 24. Januar 2020, 09:00
von /me
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."

Re: os.readlink() - komme damit nicht ganz klar

Verfasst: Freitag 24. Januar 2020, 09:12
von sparrow
@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:

Re: os.readlink() - komme damit nicht ganz klar

Verfasst: Freitag 24. Januar 2020, 11:11
von DMD-OS
hoffe es hilft:
https://github.com/mhammond/pywin32/releases
etwas runterscrollen und testen
WEISS ABER NICHT, WIE SICHER DAS IST :(

Re: os.readlink() - komme damit nicht ganz klar

Verfasst: Freitag 24. Januar 2020, 11:45
von /me
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.

Re: os.readlink() - komme damit nicht ganz klar

Verfasst: Freitag 24. Januar 2020, 16:25
von WalterT
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

Re: os.readlink() - komme damit nicht ganz klar

Verfasst: Samstag 25. Januar 2020, 17:11
von WalterT
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